package net.servir.capacidades.dao.jdbc;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.servir.capacidades.dao.CapacidadesDAO;
import net.servir.capacidades.model.Actividad;
import net.servir.capacidades.model.Ambito;
import net.servir.capacidades.model.BancoPregunta;
import net.servir.capacidades.model.CorreoMasivo;
import net.servir.capacidades.model.CorreoRegular;
import net.servir.capacidades.model.Departamento;
import net.servir.capacidades.model.Diagnostico;
import net.servir.capacidades.model.Distrito;
import net.servir.capacidades.model.Ejecutora;
import net.servir.capacidades.model.EjecutoraRegimen;
import net.servir.capacidades.model.Etapa;
import net.servir.capacidades.model.EtapaFuncion;
import net.servir.capacidades.model.ExmPerfil;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.GenOption;
import net.servir.capacidades.model.LogAuditoria;
import net.servir.capacidades.model.NivelGobierno;
import net.servir.capacidades.model.ParticipanteBusqueda;
import net.servir.capacidades.model.Persona;
import net.servir.capacidades.model.Pliego;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.Provincia;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ResponsableBusqueda;
import net.servir.capacidades.model.ResponsableEjecutoraAmbito;
import net.servir.capacidades.model.ResponsableIdentificacion;
import net.servir.capacidades.model.RptResponsableBusqueda;
import net.servir.capacidades.model.RptSeguimientoPrueba;
import net.servir.capacidades.model.RptServicioCivilBusqueda;
import net.servir.capacidades.model.Sector;
import net.servir.capacidades.model.SegPerfil;
import net.servir.capacidades.model.ServicioCivil;
import net.servir.capacidades.model.ServicioCivilBusqueda;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.Test;
import net.servir.capacidades.model.TipoDocumento;
import net.servir.capacidades.model.TipoObservacion;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.jsp.JspResponsableEdicion;
import net.servir.capacidades.model.jsp.JspUsuarioEdicion;
import net.servir.capacidades.util.SMTPSend;
import oracle.jdbc.OracleTypes;

import org.omg.PortableServer.ID_ASSIGNMENT_POLICY_ID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;
//JZM-25012013 Arson
// Se añaden librerias para el manejo de SP con parametros de salida
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import oracle.jdbc.OracleCallableStatement;

//

@Repository
public class JdbcCapacidadesDAO implements CapacidadesDAO {

	private SimpleJdbcTemplate jdbcTemplate;
	private DataSource dataSourceCenso;
	private CallableStatement callableStatement = null;
	private Connection conn = null;

	public LinkedList<Sistema> ObtenerSistema() {

		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_SISTEMA, DESCRIPCION,"
						+ " ACRONIMO, COD_ETAPA, CON_AMBITOS FROM SISTEMA WHERE COD_ETAPA <> 'FINA' ORDER BY ACRONIMO");
		LinkedList<Sistema> obj = new LinkedList<Sistema>();
		for (Map<String, Object> rec : lSectorMaps) {
			Sistema s = new Sistema();
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setAcronimo((String) rec.get("ACRONIMO"));
			s.setCon_ambitos((String) rec.get("CON_AMBITOS"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Ambito> ObtenerAmbito(Number id_sistema) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_SISTEMA, ID_AMBITO, " +

				"DESCRIPCION, ESTADO FROM AMBITO WHERE ID_SISTEMA = "
						+ id_sistema + " AND ESTADO = '1'");
		LinkedList<Ambito> obj = new LinkedList<Ambito>();
		for (Map<String, Object> rec : lSectorMaps) {
			Ambito s = new Ambito();

			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setEstado((String) rec.get("ESTADO"));
			obj.add(s);
		}
		return obj;
	}

	/*
	 * ======================================== =====CAMBIO DE METODO
	 * ObtenerAmbito==== ========================================
	 * 
	 * public LinkedList<Ambito> ObtenerAmbito(Number id_sistema) {
	 * List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(
	 * "SELECT ID_AMBITO, DESCRIPCION FROM AMBITO where id_sistema = " +
	 * id_sistema.toString() ); LinkedList<Ambito> obj = new
	 * LinkedList<Ambito>(); for(Map<String, Object> rec : lSectorMaps){ Ambito
	 * s = new Ambito(); s.setId_ambito((Number)rec.get("ID_AMBITO"));
	 * s.setId_sistema((Number)rec.get("ID_SISTEMA"));
	 * s.setDescripcion((String)rec.get("DESCRIPCION")); obj.add(s); } return
	 * obj; }========================================
	 */
	public LinkedList<Ejecutora> ObtenerEjecutora(Number id_ejecutora) {
		/*
		 * List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(
		 * "SELECT ID_EJECUTORA, ID_PLIEGO, DESCRIPCION, TELEFONO," +
		 * " UBIGEO, UBIGEO_RPT, COD_ESTADO_ENVIO, ID_NIVEL_GOBIERNO, ID_SISTEMA, ESTADO "
		 * + "FROM EJECUTORA ID_EJECUTORA = " + id_ejecutora +
		 * " AND ESTADO = '1'"); LinkedList<Ejecutora> obj = new
		 * LinkedList<Ejecutora>(); for(Map<String, Object> rec : lSectorMaps){
		 * Ejecutora s = new Ejecutora();
		 * s.setId_sistema((Number)rec.get("ID_SISTEMA"));
		 * s.setId_pliego((Number)rec.get("ID_PLIEGO"));
		 * s.setDescripcion((String)rec.get("DESCRIPCION"));
		 * s.setTelefono((String)rec.get("TELEFONO"));
		 * s.setUbigeo((String)rec.get("UBIGEO"));
		 * s.setUbigeo_rpt((String)rec.get("UBIGEO_RPT"));
		 * s.setCod_estado_envio((String)rec.get("COD_ESTADO_ENVIO"));
		 * s.setId_nivel_gobierno((Number)rec.get("ID_NIVEL_GOBIERNO"));
		 * s.setId_sistema((Number)rec.get("ID_SISTEMA"));
		 * s.setEstado((String)rec.get("ESTADO")); obj.add(s); } return obj;
		 */
		return null;
	}

	// juank
	public List ObtenerParticipanteBusqueda(String vSql) {

		List listaRptServicioCivil = null;

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate
				.queryForList(vSql);
		System.out
				.println("ObtenerParticipanteBusqueda========================");
		System.out.println(vSql);
		for (Map<String, Object> rec : lEntidadMaps) {
			RptServicioCivilBusqueda e = new RptServicioCivilBusqueda();
			e.setId_participante((Number) rec.get("ID_PARTICIPANTE"));
			e.setId_servicio_civil((Number) rec.get("ID_SERVICIO_CIVIL"));
			e.setJefe((String) rec.get("JEFE"));
			e.setResponsable((String) rec.get("RESPONSABLE"));
			e.setDni((String) rec.get("DNI"));
			e.setApellidosNombres((String) rec.get("APELLIDOSNOMBRES"));
			e.setDescripcionEjecutora((String) rec.get("DESCRIPCIONEJECUTORA"));
			e.setEvaluado((String) rec.get("H"));
			e.setEstado((String) rec.get("COD_ESTADO"));
			e.setV((String) rec.get("V"));
			e.setParticipa(((Number) rec.get("participa")).intValue());
			if (listaRptServicioCivil == null)
				listaRptServicioCivil = new ArrayList();
			listaRptServicioCivil.add(e);
			e = null;
		}
		return listaRptServicioCivil;
	}

	public List ObtenerParticipanteOficializar(String vSql) {

		List listaRptServicioCivil = null;

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate
				.queryForList(vSql);

		for (Map<String, Object> rec : lEntidadMaps) {
			RptServicioCivilBusqueda e = new RptServicioCivilBusqueda();
			e.setId_servicio_civil((Number) rec.get("ID_SERVICIO_CIVIL"));
			e.setJefe((String) rec.get("JEFE"));
			e.setDni((String) rec.get("DNI"));
			e.setApellidosNombres((String) rec.get("APELLIDOSNOMBRES"));
			e.setDescripcionEjecutora((String) rec.get("DESCRIPCIONEJECUTORA"));
			e.setEstado((String) rec.get("COD_ESTADO"));
			e.setV((String) rec.get("V"));
			if (listaRptServicioCivil == null)
				listaRptServicioCivil = new ArrayList();
			listaRptServicioCivil.add(e);
			e = null;
		}
		return listaRptServicioCivil;
	}

	public String ObtenerQueryParticipanteBusqueda(ParticipanteBusqueda obj) {

		String sql = " select par.id_participante, sc.id_servicio_civil, case when nvl(pt.cod_grupo,' ') = 'J' then 'SI' else 'NO' end as jefe, "
				+ " case when nvl((select count(id_responsable) from responsable where dni = sc.dni and id_persona = sc.id_persona),0) = 0 then 'NO' else 'SI' end as responsable, "
				+ " sc.dni, NVL(sc.ESTADO_EQUIPO,'0') as ESTADO_EQUIPO, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres, "
				+ " e.descripcion as DESCRIPCIONEJECUTORA, "
				+ " case when nvl(p.estado_validacion,'0') = '0' then 'NO' else 'SI' end as v, "
				+ " case when par.evaluado = '1' then 'SI' else 'NO' end as h, sc.cod_estado,"
				+ " nvl(par.id_participante,0) as participa "
				+ " from servicio_civil sc "
				+ " join participante par on sc.id_servicio_civil = par.id_servicio_civil "
				+ " join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona "
				+ " join ejecutora e on e.id_ejecutora = sc.id_ejecutora "
				+ " left join pliego pli on pli.id_pliego = e.id_pliego "
				+ " left join sector sec on sec.id_sector = pli.id_sector "
				+ " join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil "
				+ " join ambito am on am.id_ambito = sca.id_ambito join sistema s on s.id_sistema = am.id_sistema "
				+ " left join puesto_tipo pt on pt.id_puesto_tipo = sc.id_puesto_tipo "
				+ " where 1 = 1 ";
		if (obj.getIdTest().intValue() > 0)
			sql += " and par.id_test = " + obj.getIdTest();

		if (obj.getId_puesto_tipo() != null
				&& obj.getId_puesto_tipo().intValue() != 99
				&& obj.getId_puesto_tipo().intValue() != 0)
			sql += " and sc.id_puesto_tipo = " + obj.getId_puesto_tipo();

		if (obj.getApellidos_paterno() != null)
			if (!"".equals(obj.getApellidos_paterno()))
				sql += " and p.apellido_paterno like ('%"
						+ obj.getApellidos_paterno() + "%')";
		if (obj.getApellidos_materno() != null)
			if (!"".equals(obj.getApellidos_materno()))
				sql += " and p.apellido_materno like ('%"
						+ obj.getApellidos_materno() + "%')";
		if (obj.getNombres() != null)
			if (!"".equals(obj.getNombres()))
				sql += " and p.nombres like ('%" + obj.getNombres() + "%')";
		if (obj.getDni() != null)
			if (!"".equals(obj.getDni()))
				sql += " and p.dni = '" + obj.getDni() + "'";
		if (obj.getIdNivelGobierno() != null)
			if (obj.getIdNivelGobierno().intValue() != 0)
				sql += " and e.id_nivel_gobierno = " + obj.getIdNivelGobierno()
						+ " ";
		if (obj.getIdSector() != null)
			if (obj.getIdSector().intValue() != 0)
				sql += " and sec.id_sector = " + obj.getIdSector() + " ";
		if (obj.getIdPliego() != null)
			if (obj.getIdPliego().intValue() != 0)
				sql += " and pli.id_pliego = " + obj.getIdPliego() + " ";
		if (obj.getIdEjecutora() != null)
			if (obj.getIdEjecutora().intValue() != 0)
				sql += " and e.id_ejecutora = " + obj.getIdEjecutora() + " ";
		if (obj.getCoddep() != null)
			if (!"0".equals(obj.getCoddep()))
				sql += " and substr(e.ubigeo, 1, 2) = '" + obj.getCoddep()
						+ "' ";
		if (obj.getCodpro() != null)
			if (!"0".equals(obj.getCodpro()))
				sql += " and substr(e.ubigeo, 3, 2) = '" + obj.getCodpro()
						+ "' ";
		if (obj.getCoddis() != null)
			if (!"0".equals(obj.getCoddis()))
				sql += " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddis()
						+ "' ";
		/*
		 * if (estadoRegistro != null) { if (estadoRegistro.equals("REGI")) {
		 * sql += " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
		 * " and nvl(p.estado_validacion, '0') = '0' "; } if
		 * (estadoRegistro.equals("VALI")) { sql +=
		 * " and nvl(p.estado_validacion, '0') = '1' "; } if
		 * (estadoRegistro.equals("OBS")) { sql +=
		 * " and nvl(sc.estado_observacion,'0') = '1' "; } } else { sql +=
		 * " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
		 * " and nvl(p.estado_validacion, '0') = '0' "; }
		 */

		if (obj.getIdSistema() != null)
			if (obj.getIdSistema() != 0)
				sql += " and s.id_sistema = " + obj.getIdSistema() + " ";
		if (obj.getIdAmbito() != null)
			if (obj.getIdAmbito() != 0)
				sql += " and am.id_ambito = " + obj.getIdAmbito() + " ";
		// if(obj.getIdTest() != null)
		// if(obj.getIdTest()!= 0)
		// sql += " and par.id_test = " + obj.getIdTest().toString();

		// sql +=
		// " and not exists (select 1 from responsable where dni = sc.dni and id_persona = sc.id_persona)";
		sql += " order by sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres  ";

		return sql;
	}

	public String obtenerQueryCorreoMasivo(ParticipanteBusqueda obj,
			String dniUsuario) {

		String sql = "select nvl(par.id_participante,0) as id_participante, sc.id_servicio_civil, "
				+ " case when nvl((select count(id_responsable) from responsable where dni = sc.dni and id_persona = sc.id_persona),0) = 0 then 'NO' else 'SI' end as responsable, "
				+ " case when nvl(sc.jefe,'0') = '1' then 'SI' else 'NO' end as jefe,"
				+ " sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres, "
				+ " e.descripcion as DESCRIPCIONEJECUTORA,  case when nvl(p.estado_validacion,'0') = '0' "
				+ " then 'NO' else 'SI' end as v, "
				+ " case when nvl((select evaluado from participante where id_participante = par.id_participante),'0') = '1' then 'SI' else 'NO' end as h, "
				+ " sc.cod_estado, nvl(par.id_participante,0) as participa  from servicio_civil sc "
				+ " left join (select max(id_participante) as id_participante, id_servicio_civil "
				+ " from participante group by id_servicio_civil) par "
				+ " on sc.id_servicio_civil = par.id_servicio_civil  join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona "
				+ " join ejecutora e on e.id_ejecutora = sc.id_ejecutora  left join pliego pli on pli.id_pliego = e.id_pliego "
				+ " left join sector sec on sec.id_sector = pli.id_sector  join servicio_civil_ambito sca "
				+ " on sca.id_servicio_civil = sc.id_servicio_civil  join ambito am on am.id_ambito = sca.id_ambito "
				+ " join sistema s on s.id_sistema = am.id_sistema  where 1 = 1 ";

		// Parte correspondiente al filtro de separados para correo
		sql += " and sc.id_servicio_civil in (select dcm.id_servicio_civil from correo_masivo cm, detalle_correo_masivo dcm "
				+ " where cm.id_correo = dcm.id_correo "
				+ " and dcm.estado = '"
				+ obj.getVerDestinatariosConfirmados()
				+ "' and cm.enviado = 0 and cm.cod_usuario = '"
				+ dniUsuario
				+ "') ";

		if (obj.getApellidos_paterno() != null)
			if (!"".equals(obj.getApellidos_paterno()))
				sql += " and p.apellido_paterno like ('%"
						+ obj.getApellidos_paterno() + "%')";
		if (obj.getApellidos_materno() != null)
			if (!"".equals(obj.getApellidos_materno()))
				sql += " and p.apellido_materno like ('%"
						+ obj.getApellidos_materno() + "%')";
		if (obj.getNombres() != null)
			if (!"".equals(obj.getNombres()))
				sql += " and p.nombres like ('%" + obj.getNombres() + "%')";
		if (obj.getDni() != null)
			if (!"".equals(obj.getDni()))
				sql += " and p.dni = '" + obj.getDni() + "'";
		if (obj.getIdNivelGobierno() != null)
			if (obj.getIdNivelGobierno().intValue() != 0)
				sql += " and e.id_nivel_gobierno = " + obj.getIdNivelGobierno()
						+ " ";
		if (obj.getIdSector() != null)
			if (obj.getIdSector().intValue() != 0)
				sql += " and sec.id_sector = " + obj.getIdSector() + " ";
		if (obj.getIdPliego() != null)
			if (obj.getIdPliego().intValue() != 0)
				sql += " and pli.id_pliego = " + obj.getIdPliego() + " ";
		if (obj.getId_puesto_tipo() != null
				&& obj.getId_puesto_tipo().intValue() != 99
				&& obj.getId_puesto_tipo().intValue() != 0)
			sql += " and sc.id_puesto_tipo = " + obj.getId_puesto_tipo();
		if (obj.getIdEjecutora() != null)
			if (obj.getIdEjecutora().intValue() != 0)
				sql += " and e.id_ejecutora = " + obj.getIdEjecutora() + " ";
		if (obj.getCoddep() != null)
			if (!"0".equals(obj.getCoddep()))
				sql += " and substr(e.ubigeo, 1, 2) = '" + obj.getCoddep()
						+ "' ";
		if (obj.getCodpro() != null)
			if (!"0".equals(obj.getCodpro()))
				sql += " and substr(e.ubigeo, 3, 2) = '" + obj.getCodpro()
						+ "' ";
		if (obj.getCoddis() != null)
			if (!"0".equals(obj.getCoddis()))
				sql += " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddis()
						+ "' ";
		/*
		 * if (estadoRegistro != null) { if (estadoRegistro.equals("REGI")) {
		 * sql += " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
		 * " and nvl(p.estado_validacion, '0') = '0' "; } if
		 * (estadoRegistro.equals("VALI")) { sql +=
		 * " and nvl(p.estado_validacion, '0') = '1' "; } if
		 * (estadoRegistro.equals("OBS")) { sql +=
		 * " and nvl(sc.estado_observacion,'0') = '1' "; } } else { sql +=
		 * " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
		 * " and nvl(p.estado_validacion, '0') = '0' "; }
		 */

		if (obj.getIdSistema() != null)
			if (obj.getIdSistema() != 0)
				sql += " and s.id_sistema = " + obj.getIdSistema() + " ";
		if (obj.getIdAmbito() != null)
			if (obj.getIdAmbito() != 0)
				sql += " and am.id_ambito = " + obj.getIdAmbito() + " ";
		// if(obj.getIdTest() != null)
		// if(obj.getIdTest()!= 0)
		// sql += " and par.id_test = " + obj.getIdTest().toString();

		// sql +=
		// " and not exists (select 1 from responsable where dni = sc.dni and id_persona = sc.id_persona)";
		sql += " order by sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres  ";

		return sql;
	}

	public String obtenerQueryParticipanteOficializar(ParticipanteBusqueda obj,
			String dniUsuario) {

		String sql = " select sc.id_servicio_civil, case when nvl(sc.jefe,'0') = '1' then 'SI' else 'NO' end as jefe, "
				+ " sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres, "
				+ " e.descripcion as DESCRIPCIONEJECUTORA, "
				+ " case when nvl(p.estado_validacion,'0') = '0' then 'NO' else 'SI' end as v, "
				+ " sc.cod_estado"
				+ " from servicio_civil sc "
				+ " join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona "
				+ " join ejecutora e on e.id_ejecutora = sc.id_ejecutora "
				+ " left join pliego pli on pli.id_pliego = e.id_pliego "
				+ " left join sector sec on sec.id_sector = pli.id_sector "
				+ " join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil "
				+ " join ambito am on am.id_ambito = sca.id_ambito join sistema s on s.id_sistema = am.id_sistema "
				+ " join CANDIDATO_PARTICIPANTE cp on cp.id_servicio_civil = sc.id_servicio_civil "
				+ " where 1 = 1 and cp.COD_USUARIO = '" + dniUsuario + "' ";
		if (obj.getApellidos_paterno() != null)
			if (!"".equals(obj.getApellidos_paterno()))
				sql += " and p.apellido_paterno like ('%"
						+ obj.getApellidos_paterno() + "%')";
		if (obj.getApellidos_materno() != null)
			if (!"".equals(obj.getApellidos_materno()))
				sql += " and p.apellido_materno like ('%"
						+ obj.getApellidos_materno() + "%')";
		if (obj.getId_puesto_tipo() != null
				&& obj.getId_puesto_tipo().intValue() != 99
				&& obj.getId_puesto_tipo().intValue() != 0)
			sql += " and sc.id_puesto_tipo = " + obj.getId_puesto_tipo();
		if (obj.getNombres() != null)
			if (!"".equals(obj.getNombres()))
				sql += " and p.nombres like ('%" + obj.getNombres() + "%')";
		if (obj.getDni() != null)
			if (!"".equals(obj.getDni()))
				sql += " and p.dni = '" + obj.getDni() + "'";
		if (obj.getIdNivelGobierno() != null)
			if (obj.getIdNivelGobierno().intValue() != 0)
				sql += " and e.id_nivel_gobierno = " + obj.getIdNivelGobierno()
						+ " ";
		if (obj.getIdSector() != null)
			if (obj.getIdSector().intValue() != 0)
				sql += " and sec.id_sector = " + obj.getIdSector() + " ";
		if (obj.getIdPliego() != null)
			if (obj.getIdPliego().intValue() != 0)
				sql += " and pli.id_pliego = " + obj.getIdPliego() + " ";
		if (obj.getIdEjecutora() != null)
			if (obj.getIdEjecutora().intValue() != 0)
				sql += " and e.id_ejecutora = " + obj.getIdEjecutora() + " ";
		if (obj.getCoddep() != null)
			if (!"0".equals(obj.getCoddep()))
				sql += " and substr(e.ubigeo, 1, 2) = '" + obj.getCoddep()
						+ "' ";
		if (obj.getCodpro() != null)
			if (!"0".equals(obj.getCodpro()))
				sql += " and substr(e.ubigeo, 3, 2) = '" + obj.getCodpro()
						+ "' ";
		if (obj.getCoddis() != null)
			if (!"0".equals(obj.getCoddis()))
				sql += " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddis()
						+ "' ";
		sql += " order by sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres  ";

		return sql;
	}

	// metodo anterior no va ams
	/*
	 * public List ObtenerParticipanteBusquedaYafue(ParticipanteBusqueda obj) {
	 * List listaRptServicioCivil = null;
	 * 
	 * String sql =
	 * "select sc.id_servicio_civil, case when nvl((select estado from responsable where dni = sc.dni and id_persona = sc.id_persona),'0') = '1' then 'SI' else 'NO' end as jefe, sc.dni,"
	 * +
	 * " p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres,"
	 * + " e.descripcion as DESCRIPCIONEJECUTORA, " +
	 * " case when nvl(p.estado_validacion,'0') = '0' then 'NO' else 'SI' end as v, "
	 * +
	 * " nvl((select case when evaluado = '1' then 'SI' else 'NO' end from participante where evaluado = '1' "
	 * + " and id_servicio_civil = sc.id_servicio_civil), 'NO') as h, " + //
	 * " case when nvl(par.evaluado, '0') = '1' then 'SI' else 'NO' end as h, "
	 * + " sc.cod_estado, " +
	 * " nvl((select nvl(id_participante,0) from participante where id_servicio_civil = sc.id_servicio_civil "
	 * + " and id_test = " + obj.getIdTest().toString() + "),0) as participa " +
	 * " from servicio_civil sc " + //participante par join servicio_civil sc on
	 * par.id_servicio_civil = sc.id_servicio_civil " +
	 * " join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona " +
	 * " join ejecutora e on e.id_ejecutora = sc.id_ejecutora " +
	 * " left join pliego pli on pli.id_pliego = e.id_pliego left join sector sec on sec.id_sector = pli.id_sector "
	 * +
	 * " join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil "
	 * +
	 * " join ambito am on am.id_ambito = sca.id_ambito join sistema s on s.id_sistema = am.id_sistema "
	 * + " where 1 =  1 and sc.id_ejecutora <> 477 "; if
	 * (obj.getApellidos_paterno() != null) if
	 * (!"".equals(obj.getApellidos_paterno())) sql +=
	 * " and p.apellido_paterno like ('%" + obj.getApellidos_paterno() + "%')";
	 * if (obj.getApellidos_materno() != null) if
	 * (!"".equals(obj.getApellidos_materno())) sql +=
	 * " and p.apellido_materno like ('%" + obj.getApellidos_materno() + "%')";
	 * if (obj.getNombres() != null) if (!"".equals(obj.getNombres())) sql +=
	 * " and p.nombres like ('%" + obj.getNombres() + "%')"; if (obj.getDni() !=
	 * null) if (!"".equals(obj.getDni())) sql += " and p.dni = '" +
	 * obj.getDni() + "'"; if (obj.getIdNivelGobierno() != null) if
	 * (obj.getIdNivelGobierno().intValue() != 0) sql +=
	 * " and e.id_nivel_gobierno = " + obj.getIdNivelGobierno()+ " "; if
	 * (obj.getIdSector() != null) if (obj.getIdSector().intValue() != 0) sql +=
	 * " and sec.id_sector = " + obj.getIdSector() + " "; if (obj.getIdPliego()
	 * != null) if (obj.getIdPliego().intValue() != 0) sql +=
	 * " and pli.id_pliego = " + obj.getIdPliego() + " "; if
	 * (obj.getIdEjecutora() != null) if (obj.getIdEjecutora().intValue() != 0)
	 * sql += " and e.id_ejecutora = " + obj.getIdEjecutora() + " "; if
	 * (obj.getCoddep() != null) if (!"0".equals(obj.getCoddep())) sql +=
	 * " and substr(e.ubigeo, 1, 2) = '" + obj.getCoddep() + "' "; if
	 * (obj.getCodpro() != null) if (!"0".equals(obj.getCodpro())) sql +=
	 * " and substr(e.ubigeo, 3, 2) = '" + obj.getCodpro() + "' "; if
	 * (obj.getCoddep() != null) if (!"0".equals(obj.getCoddep())) sql +=
	 * " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddep() + "' ";
	 * 
	 * if (estadoRegistro != null) { if (estadoRegistro.equals("REGI")) { sql +=
	 * " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
	 * " and nvl(p.estado_validacion, '0') = '0' "; } if
	 * (estadoRegistro.equals("VALI")) { sql +=
	 * " and nvl(p.estado_validacion, '0') = '1' "; } if
	 * (estadoRegistro.equals("OBS")) { sql +=
	 * " and nvl(sc.estado_observacion,'0') = '1' "; } } else { sql +=
	 * " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
	 * " and nvl(p.estado_validacion, '0') = '0' "; }
	 * 
	 * 
	 * if (obj.getIdSistema() != null) if (obj.getIdSistema() != 0) sql +=
	 * " and s.id_sistema = " + obj.getIdSistema() + " "; if (obj.getIdAmbito()
	 * != null) if (obj.getIdAmbito() != 0) sql += " and am.id_ambito = " +
	 * obj.getIdAmbito() + " ";
	 * 
	 * // sql += " and par.id_test = " + obj.getIdTest().toString();
	 * 
	 * // sql +=
	 * " and not exists (select 1 from responsable where dni = sc.dni and id_persona = sc.id_persona)"
	 * ; sql +=
	 * " order by sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres  "
	 * ; List<Map<String, Object>> lEntidadMaps =
	 * jdbcTemplate.queryForList(sql);
	 * 
	 * for(Map<String, Object> rec : lEntidadMaps){ RptServicioCivilBusqueda e =
	 * new RptServicioCivilBusqueda();
	 * e.setId_servicio_civil((Number)rec.get("ID_SERVICIO_CIVIL"));
	 * e.setJefe((String)rec.get("JEFE")); e.setDni((String)rec.get("DNI"));
	 * e.setApellidosNombres((String)rec.get("APELLIDOSNOMBRES"));
	 * e.setDescripcionEjecutora((String)rec.get("DESCRIPCIONEJECUTORA"));
	 * e.setEvaluado((String)rec.get("H"));
	 * e.setEstado((String)rec.get("COD_ESTADO")); e.setV
	 * ((String)rec.get("V"));
	 * e.setParticipa(((Number)rec.get("participa")).intValue()); if
	 * (listaRptServicioCivil == null) listaRptServicioCivil = new ArrayList();
	 * listaRptServicioCivil.add(e); e = null; } return listaRptServicioCivil; }
	 */
	ServicioCivilExtractor servicioCivilExtractor = new ServicioCivilExtractor();

	private class ServicioCivilExtractor implements ResultSetExtractor {
		public Object extractData(ResultSet rs) throws SQLException,
				DataAccessException {
			return mapServicioCivil(rs);
		}
	}

	public LinkedList<Regimen> ObtenerRegimen() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select codigo, trim(descripcion) as desc_regimen "
						+ " from codigo where grupo = 'REGI' and estado = 1 order by orden");
		LinkedList<Regimen> obj = new LinkedList<Regimen>();
		for (Map<String, Object> rec : lSectorMaps) {
			Regimen s = new Regimen();
			s.setCod_regimen((String) rec.get("codigo"));
			s.setDesc_regimen((String) rec.get("desc_regimen"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<SegPerfil> obtenerPerfiles() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select id_perfil, perfil from seg_perfil");
		LinkedList<SegPerfil> obj = new LinkedList<SegPerfil>();
		for (Map<String, Object> rec : lSectorMaps) {
			SegPerfil s = new SegPerfil();
			s.setId_perfil((Number) rec.get("ID_PERFIL"));
			s.setPerfil((String) rec.get("PERFIL"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<LogAuditoria> ObtenerLogAuditoria(String dni) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select to_char(fec_accion,'DD/MM/YYYY HH24:MI') as fec_accion, ip, "
						+ " accion from LOG_AUDITORIA la join servicio_civil sc "
						+ " on la.dni = sc.dni where sc.dni = '"
						+ dni
						+ "' "
						+ " order by la.id_log_auditoria ");
		LinkedList<LogAuditoria> obj = new LinkedList<LogAuditoria>();
		for (Map<String, Object> rec : lSectorMaps) {
			LogAuditoria s = new LogAuditoria();
			s.setFec_accion((String) rec.get("fec_accion"));
			s.setIp((String) rec.get("ip"));
			s.setAccion((String) rec.get("accion"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<TipoObservacion> ObtenerTipoObservacion() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select codigo, trim(descripcion) as descripcion "
						+ " from codigo where grupo = 'TOBS' and estado = 1 order by orden");
		LinkedList<TipoObservacion> obj = new LinkedList<TipoObservacion>();
		for (Map<String, Object> rec : lSectorMaps) {
			TipoObservacion s = new TipoObservacion();
			s.setCod_observacion((String) rec.get("codigo"));
			s.setDescripcion((String) rec.get("descripcion"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Profesion> ObtenerProfesion() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select codigo, trim(descripcion) as desc_profesion "
						+ " from codigo where grupo = 'PROF' and estado = 1 order by orden");
		LinkedList<Profesion> obj = new LinkedList<Profesion>();
		for (Map<String, Object> rec : lSectorMaps) {
			Profesion s = new Profesion();
			s.setCod_profesion((String) rec.get("codigo"));
			s.setDesc_profesion((String) rec.get("desc_profesion"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Pliego> obtenerPliegos(Integer idSector) {
		StringBuilder sql = new StringBuilder();
		sql.append("select id_pliego, descripcion from pliego where id_sector =");
		sql.append(idSector.toString());
		sql.append(" and estado = 1 order by descripcion");

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql
				.toString());
		LinkedList<Pliego> obj = new LinkedList<Pliego>();
		for (Map<String, Object> rec : lSectorMaps) {
			Pliego s = new Pliego();
			s.setId_pliego((Number) rec.get("ID_PLIEGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<TipoDocumento> ObtenerTipoDocumento() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select codigo, trim(descripcion) as desc_tipo_doc "
						+ " from codigo where grupo = 'TDOC' and estado = 1 order by orden");
		LinkedList<TipoDocumento> obj = new LinkedList<TipoDocumento>();
		for (Map<String, Object> rec : lSectorMaps) {
			TipoDocumento s = new TipoDocumento();
			s.setCod_tipo_doc((String) rec.get("codigo"));
			s.setDesc_tipo_doc((String) rec.get("desc_tipo_doc"));
			obj.add(s);
		}
		return obj;
	}

	public List ObtenerFunciones(Number idServicioCivil) {

		List funciones = null;
		idServicioCivil = idServicioCivil == null ? 0 : idServicioCivil;
		String sql = "select eta.id_etapa, eta.descripcion as desc_etapa"
				+ ", net_core.f_funciones_participante("
				+ idServicioCivil.toString()
				+ ",  fun.id_funcion) as flag_funcion"
				+ ", fun.id_funcion, fun.descripcion as desc_funcion "
				+ "from etapa eta "
				+ "left join funcion fun on eta.id_etapa = fun.id_etapa";

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);
		System.out.println("sql : " + sql);
		for (Map<String, Object> obj : lEntidadMaps) {
			EtapaFuncion g = new EtapaFuncion();
			g.setId_etapa((Number) obj.get("id_etapa"));
			g.setDesc_etapa((String) obj.get("desc_etapa"));
			g.setId_funcion((Number) obj.get("id_funcion"));
			g.setDesc_funcion((String) obj.get("desc_funcion"));
			g.setFlag_funcion((String) obj.get("flag_funcion"));
			if (funciones == null)
				funciones = new ArrayList();
			funciones.add(g);
			g = null;
		}
		return funciones;

	}

	public String EditarCorreo(ServicioCivil obj) {
		String mensaje = "";
		String sql = "update SERVICIO_CIVIL SET CORREO=? "
				+ " WHERE ID_SERVICIO_CIVIL = ? ";
		jdbcTemplate.update(sql, obj.getCorreo(), obj.getId_servicio_civil());

		return mensaje;
	}

	public List<Number> ObtenerIdFuncionesSC(Number idServicioCivil) {
		String sql = "Select f.id_funcion "
				+ " ,count(*) as nro_actividad,sum(case when sca.id_actividad is not null then 1 else 0 end) as nro_actividad_sel "
				+ " from funcion f join actividad a on f.id_funcion = a.id_funcion "
				+ " left join servicio_civil_actividad sca on a.id_actividad = sca.id_actividad and sca.id_servicio_civil = ?"
				+ " group by f.id_funcion";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql,
				idServicioCivil);
		List<Number> obj = new ArrayList<Number>();
		for (Map<String, Object> rec : lSectorMaps) {
			Number id_funcion = (Number) rec.get("ID_FUNCION");
			Number nro_act_sel = (Number) rec.get("NRO_ACTIVIDAD_SEL");
			if (nro_act_sel.intValue() > 0)
				obj.add(id_funcion);
		}
		return obj;
	}

	private ServicioCivil mapServicioCivil(ResultSet rs) throws SQLException {
		ServicioCivil servicioCivil = null;
		while (rs.next()) {
			if (servicioCivil == null) {
				servicioCivil = new ServicioCivil();
				servicioCivil.setId_servicio_civil(rs
						.getInt("ID_SERVICIO_CIVIL"));
				servicioCivil.setId_sistema(rs.getInt("ID_SISTEMA"));
				servicioCivil.setId_persona(rs.getInt("ID_PERSONA"));
				if (rs.getString("CORREO") != null)
					servicioCivil.setCorreo(rs.getString("CORREO")
							.toLowerCase());

				servicioCivil.setTelefono(rs.getString("TELEFONO"));
				servicioCivil.setEstado_equipo(rs.getString("ESTADO_EQUIPO"));
				servicioCivil.setFec_observacion(rs
						.getString("FEC_OBSERVACION"));
				servicioCivil.setPlazo(rs.getInt("PLAZO"));
				servicioCivil.setFec_subsanacion(rs
						.getString("FEC_SUBSANACION"));
				servicioCivil.setDetalle_observacion(rs
						.getString("DETALLE_OBSERVACION"));
				servicioCivil.setEstado_observacion(rs
						.getString("ESTADO_OBSERVACION"));
				servicioCivil.setId_ejecutora(rs.getInt("ID_EJECUTORA"));
				servicioCivil.setId_responsable(rs.getInt("ID_RESPONSABLE"));
				servicioCivil.setCod_profesion(rs.getString("COD_PROFESION"));
				servicioCivil.setCod_regimen(rs.getString("COD_REGIMEN"));
				servicioCivil.setClave(rs.getString("CLAVE"));
				servicioCivil.setDetalle_subsanacion(rs
						.getString("DETALLE_SUBSANACION"));
				servicioCivil.setFec_registro(rs.getString("FEC_REGISTRO"));
				servicioCivil.setCod_estado(rs.getString("COD_ESTADO"));
				servicioCivil.setDni(rs.getString("DNI"));
				servicioCivil.setDniPrevio(rs.getString("DNIPREVIO"));
				servicioCivil.setNombres(rs.getString("NOMBRES"));
				servicioCivil.setApellido_paterno(rs
						.getString("APELLIDO_PATERNO"));
				servicioCivil.setApellido_materno(rs
						.getString("APELLIDO_MATERNO"));
				servicioCivil.setFec_nacimiento(rs.getString("FEC_NACIMIENTO"));
				servicioCivil.setSexo(rs.getString("SEXO"));
				servicioCivil.setCod_tipo_doc(rs.getString("COD_TIPO_DOC"));
				servicioCivil.setJefe(rs.getString("JEFE"));
				servicioCivil.setId_ambito((Number) (rs.getInt("ID_AMBITO")));
				servicioCivil.setEstado_validacion(rs
						.getString("ESTADO_VALIDACION"));
				servicioCivil.setCod_tipo_observacion(rs
						.getString("COD_TIPO_OBSERVACION"));
				servicioCivil.setEstado_subsanacion(rs
						.getString("ESTADO_SUBSANACION"));
				servicioCivil.setDniResponsableEntidad(rs
						.getString("DNIRESPONSABLE"));
				servicioCivil.setId_puesto_tipo(Integer.parseInt(rs
						.getString("ID_PUESTO_TIPO")));
			}
			// otras tablas
		}
		if (servicioCivil == null) {
			// throw new EmptyResultDataAccessException(1);
		}
		return servicioCivil;
	}

	public ServicioCivil ObtenerServicioCivil(Number idServicioCivil) {

		String sql = "SELECT sis.id_sistema, sci.ID_SERVICIO_CIVIL, sci.CORREO, sci.TELEFONO, to_char(sci.FEC_OBSERVACION,'DD/MM/YYYY') as FEC_OBSERVACION, sci.PLAZO"
				+ ", to_char(sci.FEC_SUBSANACION,'DD/MM/YYYY') as FEC_SUBSANACION, sci.DETALLE_OBSERVACION, nvl(sci.ESTADO_OBSERVACION, '0') as ESTADO_OBSERVACION, sci.ID_EJECUTORA"
				+ ", sci.COD_PROFESION, sci.COD_REGIMEN, sci.CLAVE, sci.DETALLE_SUBSANACION, to_char(sci.FEC_REGISTRO,'DD/MM/YYYY') as FEC_REGISTRO"
				+ ", sci.COD_ESTADO, sci.DNI , sci.DNIPREVIO,NVL(sci.ESTADO_EQUIPO, '0') as ESTADO_EQUIPO, sci.id_persona, sci.jefe, sca.id_ambito "
				+ ", per.NOMBRES, per.APELLIDO_PATERNO, per.APELLIDO_MATERNO, to_char(per.FEC_NACIMIENTO,'DD/MM/YYYY') as FEC_NACIMIENTO, per.SEXO, per.COD_TIPO_DOC "
				//+ ", per.ESTADO_VALIDACION, "
				+ ", CASE NVL (SCI.COD_ESTADO, 'INIC') WHEN 'INIC' THEN '0' WHEN 'CONF' THEN '0' WHEN 'OBSE' THEN '0' ELSE '1' END ESTADO_VALIDACION"
				+ ", sci.cod_tipo_observacion, sci.estado_subsanacion "
				+ ", nvl((select dni from responsable where id_responsable = sci.id_responsable), '0') as DNIRESPONSABLE, sci.id_responsable, nvl(sci.id_puesto_tipo,0) as id_puesto_tipo "
				+ " FROM SERVICIO_CIVIL sci, PERSONA per,  SERVICIO_CIVIL_AMBITO sca, ambito am, sistema sis"
				+ " WHERE sci.dni = per.dni AND sci.ID_PERSONA = per.ID_PERSONA and sci.ID_SERVICIO_CIVIL = sca.ID_SERVICIO_CIVIL and am.id_sistema = sis.id_sistema and sca.id_ambito = am.id_ambito";
		if (idServicioCivil != null && idServicioCivil.intValue() > 0)
			sql = sql + " AND sci.ID_SERVICIO_CIVIL = "
					+ idServicioCivil.toString();
		
		System.out.println("ObtenerServicioCivil(Number idServicioCivil) ========");
		System.out.println(sql);
		
		Object obj = jdbcTemplate.getJdbcOperations().query(sql,
				new Object[] {}, servicioCivilExtractor);
		if (obj != null)
			return (ServicioCivil) obj;

		return null;
	}

	public Usuario GetUsuarioIdentificacion(String dni) {

		Usuario obj = null;
		String sql = "SELECT u.cod_usuario, u.clave, per.nombres || ' ' ||per.apellido_paterno as nombre, p.perfil, p.id_perfil, u.correo "
				+ " FROM SEG_USUARIO u join SEG_USUARIO_PERFIL up on u.COD_USUARIO = up.COD_USUARIO"
				+ " join persona per on per.dni = u.COD_USUARIO join seg_perfil p on p.id_perfil = up.id_perfil"
				+ " where u.cod_usuario = '" + dni + "' and u.estado = '1' ";
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lSectorMaps) {
			obj = new Usuario();
			obj.setDni((String) rec.get("COD_USUARIO"));
			obj.setCorreo(((String) rec.get("CORREO")).toLowerCase());
			obj.setClave((String) rec.get("CLAVE"));
			obj.setDescripcion((String) rec.get("PERFIL"));
			obj.setId_perfil(((Number) rec.get("ID_PERFIL")).intValue());
			obj.setNombre((String) rec.get("NOMBRE"));
		}
		return obj;
	}

	public LinkedList<Ejecutora> ObtenerEjecutorasNivelGobierno(
			Integer idNivelGobierno, String ubigeo, Integer idSector) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT ej.id_ejecutora, ej.descripcion from ejecutora ej left join pliego pli on ej.id_pliego = pli.id_pliego ");
		sql.append(" left join sector sec on sec.id_sector = pli.id_sector ");
		sql.append(" WHERE 1 = 1 ");

		if (idNivelGobierno.intValue() > 0) {
			sql.append(" and ej.id_nivel_gobierno = ");
			sql.append(idNivelGobierno.toString());
		}
		if (idSector.intValue() > 0) {
			sql.append(" and pli.id_sector = ");
			sql.append(idSector.toString());
		}
		if (!ubigeo.equals("000") & !ubigeo.equals("")
				& !ubigeo.equals("000000")) {
			sql.append(" and ej.ubigeo like ('");
			sql.append(ubigeo);
			sql.append("%') ");
		}
		sql.append(" and ej.estado = '1' order by descripcion");

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql
				.toString());
		LinkedList<Ejecutora> obj = new LinkedList<Ejecutora>();
		for (Map<String, Object> rec : lSectorMaps) {
			Ejecutora s = new Ejecutora();
			s.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Provincia> ObtenerProvincias(String coddep) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select codpro, descripcion from ubigeo where +"
						+ " coddep = '"
						+ coddep
						+ "' and coddis = '00' and codpro <> '00' and estado = '1' order by descripcion");
		LinkedList<Provincia> obj = new LinkedList<Provincia>();
		for (Map<String, Object> rec : lSectorMaps) {
			Provincia s = new Provincia();
			s.setCodpro((String) rec.get("CODPRO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Distrito> ObtenerDistritos(String coddep, String codpro) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select coddis, descripcion from ubigeo where +"
						+ " coddep = '"
						+ coddep
						+ "' and codpro = '"
						+ codpro
						+ "' and coddis <> '00' and estado = '1' order by descripcion ");
		LinkedList<Distrito> obj = new LinkedList<Distrito>();
		for (Map<String, Object> rec : lSectorMaps) {
			Distrito s = new Distrito();
			s.setCodDis((String) rec.get("CODDIS"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;

	}

	public LinkedList<NivelGobierno> ObtenerNivelGobiernos() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select ID_NIVEL_GOBIERNO, DESCRIPCION FROM NIVEL_GOBIERNO where estado = 1");
		LinkedList<NivelGobierno> obj = new LinkedList<NivelGobierno>();
		for (Map<String, Object> rec : lSectorMaps) {
			NivelGobierno s = new NivelGobierno();
			s.setId_nivel_gobierno((Number) rec.get("ID_NIVEL_GOBIERNO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Test> ObtenerTestDiagnostico(Integer idAmbito) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList(" select id_test, id_banco_pregunta, activo, id_ambito, test, to_char(fh_inicio, 'DD/MM/YYYY') as fh_inicio, nvl(valido,'0') as valido, nvl(cod_ejecutado,'0') cod_ejecutado "
						+ " from test WHERE id_ambito = "
						+ idAmbito.toString()
						+ " order by id_test");
		LinkedList<Test> obj = new LinkedList<Test>();
		for (Map<String, Object> rec : lSectorMaps) {
			Test s = new Test();
			s.setId_test((Number) rec.get("ID_TEST"));
			s.setId_banco_pregunta((Number) rec.get("ID_BANCO_PREGUNTA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setTest((String) rec.get("TEST"));
			s.setValido((String) rec.get("VALIDO"));
			s.setCod_ejecutado((String) rec.get("COD_EJECUTADO"));
			s.setFh_inicio((String) rec.get("FH_INICIO"));
			s.setActivo((String) rec.get("ACTIVO"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Test> ObtenerListaTest(Integer idAmbito,
			Integer idTipoPrueba) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList(" select id_test, id_banco_pregunta, activo, id_ambito, test, to_char(fh_inicio, 'DD/MM/YYYY') as fh_inicio, nvl(valido,'0') as valido, nvl(cod_ejecutado,'0') cod_ejecutado "
						+ " from test WHERE id_ambito = "
						+ idAmbito.toString()
						+ " and nvl(id_tipo_prueba,1) = "
						+ idTipoPrueba.toString() + " order by id_test");
		LinkedList<Test> obj = new LinkedList<Test>();
		for (Map<String, Object> rec : lSectorMaps) {
			Test s = new Test();
			s.setId_test((Number) rec.get("ID_TEST"));
			s.setId_banco_pregunta((Number) rec.get("ID_BANCO_PREGUNTA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setTest((String) rec.get("TEST"));
			s.setValido((String) rec.get("VALIDO"));
			s.setCod_ejecutado((String) rec.get("COD_EJECUTADO"));
			s.setFh_inicio((String) rec.get("FH_INICIO"));
			s.setActivo((String) rec.get("ACTIVO"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Test> ObtenerTestDiagnosticoNoEjecutados(Integer idAmbito) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList(" select id_test, id_banco_pregunta, activo, id_ambito, test, to_char(fh_inicio, 'DD/MM/YYYY') as fh_inicio, nvl(valido,'0') as valido, nvl(cod_ejecutado,'0') cod_ejecutado "
						+ " from test WHERE id_ambito = "
						+ idAmbito.toString()
						+ " and nvl(cod_ejecutado, '0') = '0' order by id_test");
		LinkedList<Test> obj = new LinkedList<Test>();
		for (Map<String, Object> rec : lSectorMaps) {
			Test s = new Test();
			s.setId_test((Number) rec.get("ID_TEST"));
			s.setId_banco_pregunta((Number) rec.get("ID_BANCO_PREGUNTA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setTest((String) rec.get("TEST"));
			s.setValido((String) rec.get("VALIDO"));
			s.setCod_ejecutado((String) rec.get("COD_EJECUTADO"));
			s.setFh_inicio((String) rec.get("FH_INICIO"));
			s.setActivo((String) rec.get("ACTIVO"));
			obj.add(s);
		}
		return obj;
	}

	public Test obtenerTest(Integer idTest) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList(" select id_test, id_banco_pregunta, activo, id_ambito, test, to_char(fh_inicio, 'DD/MM/YYYY') as fh_inicio, valido, cod_ejecutado "
						+ "from test WHERE id_test = "
						+ idTest.toString()
						+ " order by id_test");
		Test obj = new Test();
		for (Map<String, Object> rec : lSectorMaps) {
			obj.setId_test((Number) rec.get("ID_TEST"));
			obj.setId_banco_pregunta((Number) rec.get("ID_BANCO_PREGUNTA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setTest((String) rec.get("TEST"));
			obj.setValido((String) rec.get("VALIDO"));
			obj.setCod_ejecutado((String) rec.get("COD_EJECUTADO"));
			obj.setFh_inicio((String) rec.get("FH_INICIO"));
			obj.setActivo((String) rec.get("ACTIVO"));
		}
		return obj;
	}

	public LinkedList<Departamento> ObtenerDepartamentos() {
		// select coddep, descripcion from censo.ubigeo where codpro = '00' and
		// coddis = '00'
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select coddep, descripcion from ubigeo where "
						+ " codpro = '00' and coddis = '00' and estado = '1' order by descripcion ");
		LinkedList<Departamento> obj = new LinkedList<Departamento>();
		for (Map<String, Object> rec : lSectorMaps) {
			Departamento s = new Departamento();
			s.setCodDep((String) rec.get("CODDEP"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Sector> ObtenerSectors() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select id_sector, descripcion from sector where "
						+ "  estado = '1' order by descripcion");
		LinkedList<Sector> obj = new LinkedList<Sector>();
		for (Map<String, Object> rec : lSectorMaps) {
			Sector s = new Sector();
			s.setId_sector((Number) rec.get("ID_SECTOR"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public String ObtenerClave(String dni, Integer idSistema) {
		String mensaje = "";
		CallableStatement cstmt = null;
		Connection conn = null;
		Object temp;

		try {
			conn = this.dataSourceCenso.getConnection();
			cstmt = conn
					.prepareCall("{call MAIL_CENSO.RECUPERAR_CLAVE_SERVICIO_CIVIL(?,?,?,?,?,?,?,?)}");
			cstmt.setInt(1, idSistema);
			cstmt.setString(2, dni);
			cstmt.registerOutParameter(3, OracleTypes.VARCHAR);
			cstmt.registerOutParameter(4, OracleTypes.VARCHAR); // PSENDER
			cstmt.registerOutParameter(5, OracleTypes.VARCHAR); // PRECIPIENT
			cstmt.registerOutParameter(6, OracleTypes.VARCHAR); // PSUBJECT
			cstmt.registerOutParameter(7, OracleTypes.VARCHAR); // PCONTENIDOFINAL
			cstmt.registerOutParameter(8, OracleTypes.INTEGER); // PVALIDACION
			cstmt.execute();
			mensaje = (String) cstmt.getObject(3);

			// Se activa el envío del correo a través de Java
			if (cstmt.getInt(8) > 0) {
				SMTPSend.Mail(cstmt.getString(6), cstmt.getString(7),
						cstmt.getString(5));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(cstmt == null)) {
				try {
					cstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return mensaje;

	}

	public String ObtenerNuevaClave(ServicioCivil obj) {
		String mensaje = "";
		CallableStatement cstmt = null;
		Connection conn = null;
		Object temp;
		String clave = "";

		clave = (String) this.jdbcTemplate
				.queryForObject(
						"SELECT to_char(round(dbms_random.value(1000, 9999),0)) as clave FROM dual",
						String.class, new Object[] {});

		StringBuilder sql = new StringBuilder();
		sql.append("update servicio_civil set clave ='");
		sql.append(clave);
		sql.append("' where id_servicio_civil =");
		sql.append(obj.getId_servicio_civil());
		jdbcTemplate.update(sql.toString());

		try {
			conn = this.dataSourceCenso.getConnection();
			cstmt = conn
					.prepareCall("{call MAIL_CENSO.RECUPERAR_CLAVE_SERVICIO_CIVIL(?,?,?,?,?,?,?,?)}");
			cstmt.setInt(1, obj.getId_sistema().intValue());
			cstmt.setString(2, obj.getDni());
			cstmt.registerOutParameter(3, OracleTypes.VARCHAR);
			cstmt.registerOutParameter(4, OracleTypes.VARCHAR); // PSENDER
			cstmt.registerOutParameter(5, OracleTypes.VARCHAR); // PRECIPIENT
			cstmt.registerOutParameter(6, OracleTypes.VARCHAR); // PSUBJECT
			cstmt.registerOutParameter(7, OracleTypes.VARCHAR); // PCONTENIDOFINAL
			cstmt.registerOutParameter(8, OracleTypes.INTEGER); // PVALIDACION
			cstmt.execute();
			mensaje = (String) cstmt.getObject(3);

			// Se activa el envío del correo a través de Java
			if (cstmt.getInt(8) > 0) {
				SMTPSend.Mail(cstmt.getString(6), cstmt.getString(7),
						cstmt.getString(5));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(cstmt == null)) {
				try {
					cstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return mensaje;

	}

	public Integer ObtenerPerfil(String dni, String clave) {
		try {
			Integer id_perfil = 0;
			String sql = "SELECT up.id_perfil "
					+ " FROM SEG_USUARIO u join SEG_USUARIO_PERFIL up on u.COD_USUARIO = up.COD_USUARIO "
					+ " where u.cod_usuario = '" + dni + "' and u.clave = '"
					+ clave + "' " + " and  u.ESTADO = '1'";

			id_perfil = this.jdbcTemplate.queryForInt(sql);
			return id_perfil;

		} catch (Exception e) {
			return 0;
		}
	}

	@Autowired
	public JdbcCapacidadesDAO(DataSource dataSource) {
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.dataSourceCenso = dataSource;
	}

	public String ObtenerFechaSistema() {
		try {
			String sFecha = "";
			String sql = "select to_char(sysdate,'DD/MM/YYYY') as fecha from dual";
			sFecha = (String) this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {});
			return sFecha;

		} catch (Exception e) {
			return null;
		}
	}

	public String ObtenerFechaHoraSistema() {
		try {
			String sFecha = "";
			String sql = "select to_char(sysdate,'DD/MM/YYYY HH24:MI') as fecha from dual";
			sFecha = (String) this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {});
			return sFecha;

		} catch (Exception e) {
			return null;
		}
	}

	public LinkedList<Ambito> ObtenerAmbitosPorSistema(Number idSistema) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_SISTEMA, ID_AMBITO, "
						+ "DESCRIPCION, ESTADO FROM AMBITO WHERE ID_SISTEMA = "
						+ idSistema + " AND ESTADO = '1'");
		LinkedList<Ambito> obj = new LinkedList<Ambito>();
		for (Map<String, Object> rec : lSectorMaps) {
			Ambito s = new Ambito();
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setEstado((String) rec.get("ESTADO"));
			obj.add(s);
		}
		return obj;
	}

	public List<Etapa> ObtenerEtapasAmbito(Number idAmbito) {
		// Obtenemos los Sistemas y ambitos activos sobre el cual tiene acceso
		String sql = "Select e.id_etapa, e.descripcion as etapa, f.id_funcion, f.nemotecnico, f.descripcion as funcion "
				+ " from etapa e left join funcion f on e.id_etapa = f.id_etapa"
				+ " where e.id_ambito = ? " + " order by id_etapa,nemotecnico";
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql,
				idAmbito);
		System.out.println("ObtenerEtapasAmbito : " + sql);
		Number id_etapa_antes = 0;
		Number id_etapa = 0;
		Etapa etapa = null;
		FuncionLeyenda funcion = null;
		List<Etapa> etapasAmbito = new ArrayList<Etapa>();
		for (Map<String, Object> rec : lSectorMaps) {
			id_etapa = (Number) rec.get("ID_ETAPA");
			if (id_etapa.intValue() != id_etapa_antes.intValue()) {
				etapa = new Etapa();
				etapa.setId_etapa((Number) rec.get("ID_ETAPA"));
				etapa.setId_ambito(idAmbito);
				etapa.setDescripcion((String) rec.get("ETAPA"));
				etapa.setFunciones(new ArrayList<FuncionLeyenda>());

				etapasAmbito.add(etapa);
			}
			funcion = new FuncionLeyenda();
			funcion.setId_etapa((Number) rec.get("ID_ETAPA"));
			funcion.setId_funcion((Number) rec.get("ID_FUNCION"));
			funcion.setDescripcion((String) rec.get("FUNCION"));
			funcion.setNemotecnico((String) rec.get("NEMOTECNICO"));
			if (funcion.getId_funcion() != null)
				etapa.getFunciones().add(funcion);

			etapa.setNro_funciones(etapa.getFunciones().size());

			id_etapa_antes = id_etapa;
		}
		return etapasAmbito;

	}

	public List ObtenerDatosPrueba(Integer idTest, Integer idSistema,
			Integer idAmbito) {

		CallableStatement cstmt = null;
		ResultSet rs = null;
		Connection conn = null;
		List listaRptSeguimientoPrueba = new ArrayList();
		Integer[] totales = { 0, 0, 0, 0, 0, 0, 0, 0 };

		Object temp;
		try {
			conn = this.dataSourceCenso.getConnection();
			cstmt = conn
					.prepareCall("{ call EXAMEN.SEGUIMIENTO_TEST(?,?,?,?)}");
			cstmt.setInt(1, idTest);
			cstmt.setInt(2, idAmbito);
			cstmt.setInt(3, idSistema);
			System.out.println("call EXAMEN.SEGUIMIENTO_TEST(?,?,?,?)");
			System.out.println("P1 = " + idTest);
			System.out.println("P2 = " + idAmbito);
			System.out.println("P3 = " + idSistema);
			cstmt.registerOutParameter(4, OracleTypes.CURSOR);
			cstmt.execute();
			rs = (ResultSet) cstmt.getObject(4);
			ResultSetMetaData rsm = rs.getMetaData();
			int columnCount = rsm.getColumnCount();

			while (rs.next()) {
				RptSeguimientoPrueba e = new RptSeguimientoPrueba();
				// for (int j=0;j< columnCount;j++){

				// temp = rs.getObject(j+1);
				e.setDescripcion(rs.getString("nivel_gobierno"));
				e.setParticipantes_total(rs.getString("part_total"));
				e.setParticipantes_jefe(rs.getString("part_jefe"));
				e.setParticipantes_oper(rs.getString("part_oper"));

				e.setInicio_sesion_total(rs.getString("ingr_total"));
				e.setInicio_sesion_jefe(rs.getString("ingr_jefe"));
				e.setInicio_sesion_oper(rs.getString("ingr_oper"));

				e.setCon_respuesta_total(rs.getString("rpta_total"));
				e.setCon_respuesta_jefe(rs.getString("rpta_jefe"));
				e.setCon_respuesta_oper(rs.getString("rpta_oper"));

				e.setEnviado_total(rs.getString("envi_total"));
				e.setEnviado_jefe(rs.getString("envi_jefe"));
				e.setEnviado_oper(rs.getString("envi_oper"));

				e.setCerrada_total(rs.getString("noenvi_total"));
				e.setCerrada_jefe(rs.getString("noenvi_jefe"));
				e.setCerrada_oper(rs.getString("noenvi_oper"));

				e.setEvaluado_total(rs.getString("eval_total"));
				e.setEvaluado_jefe(rs.getString("eval_jefe"));
				e.setEvaluado_oper(rs.getString("eval_oper"));

				listaRptSeguimientoPrueba.add(e);

				// }
			}
		} catch (Exception e) {
			e.getMessage();
		} finally {
			if (!(rs == null)) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(cstmt == null)) {
				try {
					cstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return listaRptSeguimientoPrueba;
	}

	public Test getTest(Integer idTest) {

		Test obj = null;

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT T.ID_TEST,T.ID_BANCO_PREGUNTA,T.ID_AMBITO,T.TEST, ");
		sql.append("TO_CHAR(T.FH_ACTIVACION, 'DD/MM/YYYY') AS FH_ACTIVACION, ");
		sql.append("TO_CHAR(T.FH_INICIO,'DD/MM/YYYY HH24:MI') AS FH_INICIO, ");
		sql.append("TO_CHAR(FH_FIN,'DD/MM/YYYY HH24:MI') AS FH_FIN, ");
		sql.append("t.ACTIVO,COD_EJECUTADO,USUARIO_ACT,TO_CHAR(FEC_ACT,'DD/MM/YYYY') AS FEC_ACT, ");
		sql.append("TO_CHAR(FEC_PROGRAMACION,'DD/MM/YYYY') AS FEC_PROGRAMACION,VALIDO, ");
		sql.append("s.id_sistema, nvl(ID_EXM_PERFIL,0) as ID_EXM_PERFIL, ");
		sql.append("nvl(t.id_tipo_prueba,1) id_tipo_prueba ");
		sql.append(" FROM test t, ambito a, sistema s WHERE t.id_ambito = a.id_ambito and a.id_sistema = s.id_sistema and ID_TEST = ? ");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(
				sql.toString(), idTest);
		for (Map<String, Object> rec : collec) {
			obj = new Test();
			obj.setId_test((Number) rec.get("ID_TEST"));
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setId_exm_perfil((Number) rec.get("ID_EXM_PERFIL"));
			obj.setId_banco_pregunta((Number) rec.get("ID_BANCO_PREGUNTA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setTest((String) rec.get("TEST"));
			obj.setFh_activacion((String) rec.get("FH_ACTIVACION"));
			obj.setFh_inicio((String) rec.get("FH_INICIO"));
			obj.setFh_fin((String) rec.get("FH_FIN"));
			obj.setActivo((String) rec.get("ACTIVO"));
			obj.setCod_ejecutado((String) rec.get("COD_EJECUTADO"));
			obj.setUsuario_act((String) rec.get("USUARIO_ACT"));
			obj.setFec_act((String) rec.get("FEC_ACT"));
			obj.setFec_programacion((String) rec.get("FEC_PROGRAMACION"));
			obj.setValido((String) rec.get("VALIDO"));
			obj.setId_tipo_prueba((String) rec.get("id_tipo_prueba").toString());
		}
		return obj;

	}

	public LinkedList<BancoPregunta> obtenerBancoPreguntas() {

		LinkedList<BancoPregunta> list = new LinkedList<BancoPregunta>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_BANCO_PREGUNTA,to_char(FEC_APERTURA, 'DD/MM/YYYY') AS FEC_APERTURA,to_char(FEC_CIERRE, 'DD/MM/YYYY') AS FEC_CIERRE,ESTADO, BANCO_PREGUNTA");
		sql.append(" FROM BANCO_PREGUNTA");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql
				.toString());
		for (Map<String, Object> rec : collec) {
			BancoPregunta obj = new BancoPregunta();
			obj.setId_banco_pregunta((Number) rec.get("ID_BANCO_PREGUNTA"));
			obj.setFec_apertura((String) rec.get("FEC_APERTURA"));
			obj.setFec_cierre((String) rec.get("FEC_CIERRE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setBanco_pregunta((String) rec.get("BANCO_PREGUNTA"));
			list.add(obj);
		}
		return list;

	}

	public LinkedList<ExmPerfil> obtenerExmPerfiles(Integer idSistema) {

		LinkedList<ExmPerfil> list = new LinkedList<ExmPerfil>();

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT ID_EXM_PERFIL, EXM_PERFIL, NRO_PREGUNTAS, MAX_NRO_FUNCIONES, ESTADO, COD_USUARIO_CREA, to_char(FECHA_CREACION,'DD/MM/YYYY') AS FECHA_CREACION, ");
		sql.append(" COD_USUARIO_MODIFICA, to_char(FECHA_MODIFICACION,'DD/MM/YYYY') AS FECHA_MODIFICACION, ID_SISTEMA ");
		sql.append(" FROM EXM_PERFIL where id_sistema =");
		sql.append(idSistema.toString());

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql
				.toString());
		for (Map<String, Object> rec : collec) {
			ExmPerfil obj = new ExmPerfil();
			obj.setId_exm_perfil(((Number) rec.get("ID_EXM_PERFIL")));
			obj.setExm_perfil((String) rec.get("EXM_PERFIL"));
			obj.setNro_preguntas(((Number) rec.get("NRO_PREGUNTAS")));
			obj.setMax_nro_funciones(((Number) rec.get("MAX_NRO_FUNCIONES")));
			obj.setEstado(((String) rec.get("ESTADO")));
			obj.setCod_usuario_crea(((String) rec.get("COD_USUARIO_CREA")));
			obj.setFecha_creacion(((String) rec.get("FECHA_CREACION")));
			obj.setCod_usuario_modifica(((String) rec
					.get("COD_USUARIO_MODIFICA")));
			obj.setFecha_modificacion(((String) rec.get("FECHA_MODIFICACION")));
			obj.setId_sistema(((Number) rec.get("ID_SISTEMA")));
			list.add(obj);
		}
		return list;

	}

	/*
	 * =========================================================== ============
	 * juank pasando de censo a capacidades(INICIO)=========
	 * ==========================================================
	 */
	public Responsable GetResponsablePorDNI(String dni, Number idAmbito) {
		Responsable obj = null;

		String sql = "SELECT res.ID_RESPONSABLE, res.DNI, res.CORREO, COD_PROFESION, res.COD_REGIMEN, CLAVE, res.ESTADO, res.COD_ROL_RESPONSABLE,"
				+ " ej.TELEFONO, res.ID_PERSONA, res.DNIPREVIO, res.ID_DIAGNOSTICO, rea.id_ejecutora,"
				+ " (select count(id_servicio_civil) from servicio_civil"
				+ " where id_ejecutora = rea.id_ejecutora) as inscritos,"
				+ " TO_CHAR(REA.FEC_FIN_CENSO,'DD/MM/YYYY') AS FEC_FIN_CENSO"
				+ " FROM RESPONSABLE res join responsable_ejecutora_ambito rea "
				+ " on res.id_responsable = rea.id_responsable "
				+ " left join ejecutora ej on ej.id_ejecutora = rea.id_ejecutora "
				+ " where res.dni = '"
				+ dni.trim()
				+ "' and rea.id_ambito = "
				+ idAmbito.intValue();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Responsable();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setDni((String) rec.get("DNI"));
			obj.setCorreo(((String) rec.get("CORREO")).toLowerCase());
			obj.setCod_profesion((String) rec.get("COD_PROFESION"));
			obj.setCod_regimen((String) rec.get("COD_REGIMEN"));
			obj.setClave((String) rec.get("CLAVE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setCod_rol_responsable((String) rec.get("COD_ROL_RESPONSABLE"));
			obj.setTelefono((String) rec.get("TELEFONO"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			Number insc = ((Number) rec.get("INSCRITOS"));
			obj.setInscritos(insc.intValue());
			obj.setFec_fin_censo((String) rec.get("FEC_FIN_CENSO"));
		}
		return obj;
	}

	// getResponsable
	public Responsable GetResponsable(Number idResponsable) {
		Responsable obj = null;

		String sql = "SELECT res.ID_RESPONSABLE,res.ID_PERSONA, res.dni, res.dniprevio, res.CORREO, res.COD_PROFESION, res.COD_REGIMEN, "
				+ " res.CLAVE, res.ESTADO,res.COD_ROL_RESPONSABLE, nvl(ej.TELEFONO,'SIN DATOS') as TELEFONO, res.ID_DIAGNOSTICO,"
				+ " (select count(bsc.id_servicio_civil) from servicio_civil bsc, servicio_civil_ambito bsca, persona p "
				+ " where bsc.id_servicio_civil = bsca.id_servicio_civil and bsc.id_ejecutora = rea.id_ejecutora and bsca.id_ambito = rea.id_ambito and bsc.id_ejecutora <>0 AND bsc.dni = p.dni AND bsc.id_persona = p.id_persona) as inscritos, "
				+ " (select count(bsc.id_servicio_civil) from servicio_civil bsc, servicio_civil_ambito bsca "
				+ " where bsc.id_servicio_civil = bsca.id_servicio_civil and bsc.id_ejecutora = rea.id_ejecutora and bsca.id_ambito = rea.id_ambito "
				+ " and dni <> res.dni and id_persona <> res.id_persona and bsc.id_ejecutora <>0) as inscritosreales, "
				+ " (select count(bsc.id_servicio_civil) from servicio_civil bsc, servicio_civil_ambito bsca, persona p "
				+ " where bsc.id_servicio_civil = bsca.id_servicio_civil and bsc.id_ejecutora = rea.id_ejecutora and bsca.id_ambito = rea.id_ambito and jefe = '1' AND bsc.dni = p.dni AND bsc.id_persona = p.id_persona) as jefesinscritos, "
				+ " (select count(bsc.id_servicio_civil) from servicio_civil bsc, servicio_civil_ambito bsca, persona p "
				+ " where bsc.id_servicio_civil = bsca.id_servicio_civil and bsc.id_ejecutora = rea.id_ejecutora and bsca.id_ambito = rea.id_ambito and jefe = '0' AND bsc.dni = p.dni AND bsc.id_persona = p.id_persona) as operadoresinscritos, "
				+ " (select to_char(max(fec_validacion), 'DD/MM/YYYY') from persona per "
				+ " join servicio_civil sc on sc.dni = per.dni and sc.id_persona = per.id_persona "
				+ " join servicio_civil_ambito sca on sc.id_servicio_civil = sca.id_servicio_civil "
				+ " where id_ejecutora = rea.id_ejecutora and sca.id_ambito = rea.id_ambito) as max_fec_validacion, "
				+ " rea.cod_modalidad, "
				+
				/*
				 * " case nvl(rea.estado_registro, '0') when '0' then 'NO HABILITADO' "
				 * + " when '1' then 'HABILITADO' when '2' then 'FINALIZADO' " +
				 * " when '3' then 'CERRADO' end estado_registro, " +
				 */
				" CASE "
				+ " WHEN TO_DATE (REA.FEC_CIERRE) < TO_DATE (SYSDATE) "
				+ " THEN "
				+ "   'NO HABILITADO' "
				+ " ELSE "
				+ "   CASE NVL (rea.estado_registro, '0') "
				+ "      WHEN '0' THEN 'NO HABILITADO' "
				+ "      WHEN '1' THEN 'HABILITADO' "
				+ "      WHEN '2' THEN 'FINALIZADO' "
				+ "      WHEN '3' THEN 'CERRADO' "
				+ "   END "
				+ "END estado_registro,"
				+

				" to_char(res.fec_registro, 'DD/MM/YYYY') as fec_registro, "
				+ " to_char(rea.fec_habilitacion, 'DD/MM/YYYY') as fec_habilitacion, nvl(rea.ID_EJECUTORA, 0) as ID_EJECUTORA, "
				+ " rea.id_ambito, "
				+ " TO_CHAR(REA.FEC_FIN_CENSO,'DD/MM/YYYY') AS FEC_FIN_CENSO, "
				+ " res.NOMBREPUESTO, "
				+ " res.CONFIANZA, "
				+ " res.PERTENECERRHH, "
				+ " res.ENADICION, "
				+ " TRIM(res.ESTADOENPUESTO) ESTADOENPUESTO"
				+ " FROM RESPONSABLE res join responsable_ejecutora_ambito rea on "
				+ " res.id_responsable = rea.id_responsable "
				+ " left join ejecutora ej on ej.id_ejecutora = rea.id_ejecutora "
				+ " WHERE res.id_responsable = " + idResponsable;

		System.out.println(sql);
		/*
		 * jefesinscritos, operadoresinscritos, max_fec_validacion, TELEFONO
		 * SELECT res.ID_RESPONSABLE,res.ID_PERSONA, res.dni, res.dniprevio,
		 * res.CORREO, res.COD_PROFESION, res.COD_REGIMEN, res.CLAVE,
		 * res.ESTADO,res.COD_ROL_RESPONSABLE, ej.TELEFONO, res.ID_DIAGNOSTICO,
		 * (select count(id_servicio_civil) from servicio_civil where
		 * id_ejecutora = rea.id_ejecutora) as inscritos, (select
		 * count(id_servicio_civil) from servicio_civil where id_ejecutora =
		 * rea.id_ejecutora and jefe = '1') as jefesinscritos, (select
		 * count(id_servicio_civil) from servicio_civil where id_ejecutora =
		 * rea.id_ejecutora and jefe = '0') as operadoresinscritos, (select
		 * to_char(max(fec_validacion), 'DD/MM/YYYY HH24:MI') from persona per
		 * join servicio_civil sc on sc.dni = per.dni and sc.id_persona =
		 * per.id_persona where id_ejecutora = rea.id_ejecutora) as
		 * max_fec_validacion FROM RESPONSABLE res join
		 * responsable_ejecutora_ambito rea on res.id_responsable =
		 * rea.id_responsable join ejecutora ej on ej.id_ejecutora =
		 * rea.id_ejecutora WHERE res.id_responsable = 1186
		 */

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Responsable();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setId_diagnostico((Number) rec.get("ID_DIAGNOSTICO"));
			obj.setDni((String) rec.get("DNI"));
			obj.setDniprevio((String) rec.get("DNIPREVIO"));
			obj.setCorreo(((String) rec.get("CORREO")).toLowerCase());
			obj.setCod_profesion((String) rec.get("COD_PROFESION"));
			obj.setCod_regimen((String) rec.get("COD_REGIMEN"));
			obj.setClave((String) rec.get("CLAVE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setCod_rol_responsable((String) rec.get("COD_ROL_RESPONSABLE"));
			obj.setTelefono((String) rec.get("TELEFONO"));
			obj.setInscritos(((Number) rec.get("INSCRITOS")).intValue());
			obj.setInscritosReales(((Number) rec.get("INSCRITOSREALES"))
					.intValue());
			obj.setJefesinscritos(((Number) rec.get("JEFESINSCRITOS"))
					.intValue());
			obj.setOperadoresinscritos(((Number) rec.get("OPERADORESINSCRITOS"))
					.intValue());
			obj.setMax_fec_validacion((String) rec.get("MAX_FEC_VALIDACION"));
			obj.setCodModalidad((String) rec.get("COD_MODALIDAD"));
			obj.setEstado_registro((String) rec.get("ESTADO_REGISTRO"));
			obj.setFec_registro((String) rec.get("FEC_REGISTRO"));
			obj.setFec_habilitacion((String) rec.get("FEC_HABILITACION"));
			obj.setFec_fin_censo((String) rec.get("FEC_FIN_CENSO"));

			obj.setNombrepuesto((String) rec.get("NOMBREPUESTO"));
			obj.setConfianza((String) rec.get("CONFIANZA"));
			obj.setPertencerrhh((String) rec.get("PERTENECERRHH"));
			obj.setEnadicion((String) rec.get("ENADICION"));
			obj.setEstadoenpuesto((String) rec.get("ESTADOENPUESTO"));
		}
		return obj;
	}

	// Obtener Servicio
	public ServicioCivil ObtenerServicioCivilPorDNI(String dni,
			Number id_persona, Number id_ambito) {
		String sql = "SELECT sci.ID_SERVICIO_CIVIL, sci.CORREO, sci.TELEFONO, to_char(sci.FEC_OBSERVACION,'DD/MM/YYYY') as FEC_OBSERVACION, sci.PLAZO"
				+ ", to_char(sci.FEC_SUBSANACION,'DD/MM/YYYY') as FEC_SUBSANACION, sci.DETALLE_OBSERVACION, nvl(sci.ESTADO_OBSERVACION, '0') as ESTADO_OBSERVACION, sci.ID_EJECUTORA"
				+ ", sci.COD_PROFESION, sci.COD_REGIMEN, NVL(sci.ESTADO_EQUIPO, '0') as ESTADO_EQUIPO, sci.CLAVE, sci.DETALLE_SUBSANACION, to_char(sci.FEC_REGISTRO,'DD/MM/YYYY') as FEC_REGISTRO"
				+ ", sci.COD_ESTADO, sci.DNI , sci.DNIPREVIO, sci.id_persona, sci.jefe, sca.id_ambito "
				+ ", per.NOMBRES, per.APELLIDO_PATERNO, per.APELLIDO_MATERNO, to_char(per.FEC_NACIMIENTO,'DD/MM/YYYY') as FEC_NACIMIENTO, per.SEXO, per.COD_TIPO_DOC "
				+ ", per.ESTADO_VALIDACION, sci.cod_tipo_observacion, sci.estado_subsanacion "
				+ ", nvl((select dni from responsable where id_responsable = sci.id_responsable),0) as DNIRESPONSABLE, sci.id_responsable, sis.id_sistema,nvl(sci.id_puesto_tipo,0) as id_puesto_tipo  "
				+ " FROM SERVICIO_CIVIL sci, PERSONA per,  SERVICIO_CIVIL_AMBITO sca, ambito amb, sistema sis "
				+ " WHERE sci.dni = per.dni AND sci.ID_PERSONA = per.ID_PERSONA and sci.ID_SERVICIO_CIVIL = sca.ID_SERVICIO_CIVIL and amb.id_sistema = sis.id_sistema and amb.id_ambito = sca.id_ambito"
				+ " and amb.id_ambito =" + id_ambito + " ";
		if (dni != null && id_persona.intValue() > 0)
			sql = sql + " AND sci.dni = '" + dni.toString()
					+ "' and sci.id_persona = " + id_persona.toString();
		Object obj = jdbcTemplate.getJdbcOperations().query(sql,
				new Object[] {}, servicioCivilExtractor);
		if (obj != null)
			return (ServicioCivil) obj;

		return null;
	}

	public LinkedList<Test> ObtenerTestDiagnoticoPorDNI(String dni,
			Number id_persona) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select t.id_test, t.test, to_char(t.fec_programacion, 'DD/MM/YYYY') as fec_programacion, "
						+ " case when nvl(par.evaluado, '0') = '1' then 'EVALUADO' else 'NO EVALUADO' end as ESTADOPARTICIPANTE "
						+ " from participante par, servicio_civil sc, test t "
						+ " where par.id_servicio_civil = sc.id_servicio_civil and par.evaluado = '1' "
						+ " and t.id_test = par.id_test and sc.dni = '"
						+ dni
						+ "' and sc.id_persona = "
						+ id_persona
						+ " order by id_test");

		LinkedList<Test> obj = new LinkedList<Test>();
		for (Map<String, Object> rec : lSectorMaps) {
			Test o = new Test();
			o.setId_test((Number) rec.get("ID_TEST"));
			o.setTest((String) rec.get("TEST"));
			o.setFec_programacion((String) rec.get("FEC_PROGRAMACION"));
			o.setEstadoParticipante((String) rec.get("ESTADOPARTICIPANTE"));
			obj.add(o);
		}
		return obj;
	}

	// obtener diagnostico
	public List<Diagnostico> ObtenerDiagnosticos() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select id_diagnostico, "
						+ " descripcion, to_char(fec_prueba, 'dd/mm/yyy') as fec_prueba, to_char(fec_ini_habilitacion,'dd/mm/yyy') as fec_ini_habilitacion, "
						+ " to_char(fec_fin_habilitacion, 'dd/mm/yyy') as fec_fin_habilitacion, to_char(fec_ini_registro, 'dd/mm/yyy') as fec_ini_registro, to_char(fec_fin_registro, 'dd/mm/yyy') as fec_fin_registro, estado "
						+ " from diagnostico where estado = 1");
		LinkedList<Diagnostico> obj = new LinkedList<Diagnostico>();
		for (Map<String, Object> rec : lSectorMaps) {
			Diagnostico s = new Diagnostico();
			s.setId_diagnostico((Number) rec.get("ID_DIAGNOSTICO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setFec_prueba((String) rec.get("FEC_PRUEBA"));
			s.setFec_ini_habilitacion((String) rec.get("FEC_INI_HABILITACION"));
			s.setFec_fin_habilitacion((String) rec.get("FEC_FIN_HABILITACION"));
			s.setFec_ini_registro((String) rec.get("FEC_INI_REGISTRO"));
			s.setFec_fin_registro((String) rec.get("FEC_FIC_REGISTRO"));
			s.setEstado((String) rec.get("ESTADO"));
			obj.add(s);
		}
		return obj;
	}

	// get diagnostico
	public Diagnostico GetDiagnostico(Number idDiagnostico) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("select id_diagnostico, "
						+ " descripcion, to_char(fec_prueba, 'dd/mm/yyy') as fec_prueba, to_char(fec_ini_habilitacion,'dd/mm/yyy') as fec_ini_habilitacion, "
						+ " to_char(fec_fin_habilitacion, 'dd/mm/yyy') as fec_fin_habilitacion, to_char(fec_ini_registro, 'dd/mm/yyy') as fec_ini_registro, to_char(fec_fin_registro, 'dd/mm/yyy') as fec_fin_registro, estado "
						+ " from diagnostico where id_diagnostico = "
						+ idDiagnostico.intValue() + " and estado = 1");
		Diagnostico s = new Diagnostico();
		for (Map<String, Object> rec : lSectorMaps) {
			s.setId_diagnostico((Number) rec.get("ID_DIAGNOSTICO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setFec_prueba((String) rec.get("FEC_PRUEBA"));
			s.setFec_ini_habilitacion((String) rec.get("FEC_INI_HABILITACION"));
			s.setFec_fin_habilitacion((String) rec.get("FEC_FIN_HABILITACION"));
			s.setFec_ini_registro((String) rec.get("FEC_INI_REGISTRO"));
			s.setFec_fin_registro((String) rec.get("FEC_FIC_REGISTRO"));
			s.setEstado((String) rec.get("ESTADO"));

		}
		return s;
	}

	public CorreoRegular getCorreoRegular(CorreoRegular correo) {
		String sql = "SELECT CUERPO, ASUNTO FROM CORREO_REGULAR where cod_tipo = '"
				+ correo.getCod_tipo()
				+ "' and id_sistema = "
				+ correo.getId_sistema()
				+ " and id_ambito = "
				+ correo.getId_ambito();
		// List<Map<String, Object>> lSectorMaps =
		// jdbcTemplate.queryForList(sql,
		// correo.getCod_tipo(), correo.getId_sistema(),
		// correo.getId_ambito());
		System.out.println("getCorreoRegular");
		System.out.println(sql);
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		for (Map<String, Object> rec : lSectorMaps) {
			correo.setCuerpo((String) rec.get("CUERPO"));
			correo.setAsunto((String) rec.get("ASUNTO"));
		}
		return correo;
	}

	// getPersona
	public Persona GetPersona(Responsable responsable) {
		Persona obj = null;

		String sql = "SELECT DNI,NOMBRES,APELLIDO_PATERNO,APELLIDO_MATERNO,to_char(FEC_NACIMIENTO,'DD/MM/YYYY') as FEC_NACIMIENTO"
				+ " ,SEXO,COD_TIPO_DOC,nvl(ESTADO_VALIDACION,'0') as ESTADO_VALIDACION,to_char(FEC_VALIDACION,'DD/MM/YYYY') as FEC_VALIDACION,"
				+ "ROL_VALIDACION, ID_PERSONA, "
				+ "TELEFONO,ANEXO,FAX,CELULAR,RPMRPC,COMENTARIOS "
				+ "FROM PERSONA WHERE dni = '"
				+ responsable.getDni()
				+ "' and id_persona = " + responsable.getId_persona(); // and
																		// id_persona
																		// = " +
																		// responsable.getId_persona();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Persona();
			obj.setDni((String) rec.get("DNI"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setNombres((String) rec.get("NOMBRES"));
			obj.setApellido_paterno((String) rec.get("APELLIDO_PATERNO"));
			obj.setApellido_materno((String) rec.get("APELLIDO_MATERNO"));
			obj.setFec_nacimiento((String) rec.get("FEC_NACIMIENTO"));
			obj.setSexo((String) rec.get("SEXO"));
			obj.setCod_tipo_doc((String) rec.get("COD_TIPO_DOC"));
			obj.setEstado_validacion((String) rec.get("ESTADO_VALIDACION"));
			obj.setFec_validacion((String) rec.get("FEC_VALIDACION"));
			obj.setRol_validacion((String) rec.get("ROL_VALIDACION"));
			obj.setTelefono((String) rec.get("TELEFONO"));
			obj.setAnexo((Number) rec.get("ANEXO"));
			obj.setFax((Number) rec.get("FAX"));
			obj.setCelular((Number) rec.get("CELULAR"));
			obj.setRpmrpc((String) rec.get("RPMRPC"));
			obj.setComentarios((String) rec.get("COMENTARIOS"));
		}
		return obj;
	}

	public Persona GetPersona(String dni) {
		Persona obj = null;

		String sql = "SELECT DNI,NOMBRES,APELLIDO_PATERNO,APELLIDO_MATERNO,to_char(FEC_NACIMIENTO,'DD/MM/YYYY') as FEC_NACIMIENTO"
				+ " ,SEXO,COD_TIPO_DOC,nvl(ESTADO_VALIDACION,'0') as ESTADO_VALIDACION,to_char(FEC_VALIDACION,'DD/MM/YYYY') as FEC_VALIDACION,"
				+ "ROL_VALIDACION, ID_PERSONA FROM PERSONA WHERE dni = '"
				+ dni
				+ "' "; // and id_persona = " + responsable.getId_persona();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Persona();
			obj.setDni((String) rec.get("DNI"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setNombres((String) rec.get("NOMBRES"));
			obj.setApellido_paterno((String) rec.get("APELLIDO_PATERNO"));
			obj.setApellido_materno((String) rec.get("APELLIDO_MATERNO"));
			obj.setFec_nacimiento((String) rec.get("FEC_NACIMIENTO"));
			obj.setSexo((String) rec.get("SEXO"));
			obj.setCod_tipo_doc((String) rec.get("COD_TIPO_DOC"));
			obj.setEstado_validacion((String) rec.get("ESTADO_VALIDACION"));
			obj.setFec_validacion((String) rec.get("FEC_VALIDACION"));
			obj.setRol_validacion((String) rec.get("ROL_VALIDACION"));
		}
		return obj;
	}

	public Persona GetPersona(String dni, Number idAmbito) {
		Persona obj = null;

		String sql = "SELECT S1.DNI,S1.NOMBRES,S1.APELLIDO_PATERNO,S1.APELLIDO_MATERNO,to_char(S1.FEC_NACIMIENTO,'DD/MM/YYYY') as FEC_NACIMIENTO"
				+ " ,S1.SEXO,S1.COD_TIPO_DOC,nvl(S1.ESTADO_VALIDACION,'0') as ESTADO_VALIDACION,to_char(S1.FEC_VALIDACION,'DD/MM/YYYY') as FEC_VALIDACION,"
				+ "S1.ROL_VALIDACION, S1.ID_PERSONA FROM PERSONA S1 "
				+ "JOIN RESPONSABLE S2 ON S2.ID_PERSONA=S1.ID_PERSONA "
				+ "JOIN RESPONSABLE_EJECUTORA_AMBITO S3 ON S3.ID_RESPONSABLE=S2.ID_RESPONSABLE "
				+ "WHERE S1.dni = '" + dni + "' AND S3.ID_AMBITO=" + idAmbito; 
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Persona();
			obj.setDni((String) rec.get("DNI"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setNombres((String) rec.get("NOMBRES"));
			obj.setApellido_paterno((String) rec.get("APELLIDO_PATERNO"));
			obj.setApellido_materno((String) rec.get("APELLIDO_MATERNO"));
			obj.setFec_nacimiento((String) rec.get("FEC_NACIMIENTO"));
			obj.setSexo((String) rec.get("SEXO"));
			obj.setCod_tipo_doc((String) rec.get("COD_TIPO_DOC"));
			obj.setEstado_validacion((String) rec.get("ESTADO_VALIDACION"));
			obj.setFec_validacion((String) rec.get("FEC_VALIDACION"));
			obj.setRol_validacion((String) rec.get("ROL_VALIDACION"));
		}
		return obj;
	}

	public Persona GetPersonaPorEmail(String email, Number idAmbito) {
		Persona obj = null;

		String sql = "SELECT S1.DNI, "
				+ "S1.NOMBRES, "
				+ "S1.APELLIDO_PATERNO, "
				+ "S1.APELLIDO_MATERNO, "
				+ "TO_CHAR (S1.FEC_NACIMIENTO, 'DD/MM/YYYY') AS FEC_NACIMIENTO, "
				+ "S1.SEXO, "
				+ "S1.COD_TIPO_DOC, "
				+ "NVL (S1.ESTADO_VALIDACION, '0') AS ESTADO_VALIDACION, "
				+ "TO_CHAR (S1.FEC_VALIDACION, 'DD/MM/YYYY') AS FEC_VALIDACION, "
				+ "S1.ROL_VALIDACION, "
				+ "S1.ID_PERSONA "
				+ "FROM PERSONA S1 "
				+ "JOIN RESPONSABLE S2 ON S1.ID_PERSONA = S2.ID_PERSONA "
				+ "JOIN RESPONSABLE_EJECUTORA_AMBITO S3 ON S3.ID_RESPONSABLE=S2.ID_RESPONSABLE "
				+ "WHERE UPPER(S2.CORREO) = UPPER('" + email
				+ "') AND S3.ID_AMBITO=" + idAmbito; // and id_persona = " +
														// responsable.getId_persona();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Persona();
			obj.setDni((String) rec.get("DNI"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setNombres((String) rec.get("NOMBRES"));
			obj.setApellido_paterno((String) rec.get("APELLIDO_PATERNO"));
			obj.setApellido_materno((String) rec.get("APELLIDO_MATERNO"));
			obj.setFec_nacimiento((String) rec.get("FEC_NACIMIENTO"));
			obj.setSexo((String) rec.get("SEXO"));
			obj.setCod_tipo_doc((String) rec.get("COD_TIPO_DOC"));
			obj.setEstado_validacion((String) rec.get("ESTADO_VALIDACION"));
			obj.setFec_validacion((String) rec.get("FEC_VALIDACION"));
			obj.setRol_validacion((String) rec.get("ROL_VALIDACION"));
		}
		return obj;
	}

	/*
	 * ===========================================================
	 * ===================== censoDAO INICIO ====================
	 * ==========================================================
	 */
	public List<ResponsableEjecutoraAmbito> ObtenerAmbitosResponsable(
			Number idResponsable) {

		List<ResponsableEjecutoraAmbito> list = new LinkedList<ResponsableEjecutoraAmbito>();

		/*
		 * @JZM-23012013 Arson Se modifica la obtención de los días restantes
		 * 
		 * (nvl(rea.FEC_CIERRE,fec_habilitacion + plazo) - trunc(sysdate)) por
		 * NET_CORE.F_DIAS_RESTANTES(REA.FEC_HABILITACION,
		 * REA.FEC_CIERRE,REA.PLAZO)
		 * 
		 * String sql =
		 * "SELECT rea.ID_RESPONSABLE, rea.ID_EJECUTORA, rea.ID_AMBITO, rea.ESTADO, to_char(rea.FEC_HABILITACION,'DD/MM/YYYY') as FEC_HABILITACION"
		 * +
		 * ", rea.PLAZO, rea.ESTADO_REGISTRO, to_char(nvl(rea.FEC_CIERRE,fec_habilitacion + plazo),'DD/MM/YYYY') as FEC_CIERRE  "
		 * +
		 * " , (nvl(rea.FEC_CIERRE,fec_habilitacion + plazo) - trunc(sysdate)) as dias_restantes, sis.id_sistema "
		 * +" from responsable_ejecutora_ambito rea, ambito am, sistema sis" +
		 * " where rea.id_ambito = am.id_ambito and sis.id_sistema = am.id_sistema "
		 * +" and id_responsable = ? ";
		 */
		String sql = "SELECT rea.ID_RESPONSABLE, rea.ID_EJECUTORA, rea.ID_AMBITO, rea.ESTADO, to_char(rea.FEC_HABILITACION,'DD/MM/YYYY') as FEC_HABILITACION"
				+ ", rea.PLAZO, rea.ESTADO_REGISTRO, to_char(nvl(rea.FEC_CIERRE,fec_habilitacion + plazo),'DD/MM/YYYY') as FEC_CIERRE  "
				+ " , NET_CORE.F_DIAS_RESTANTES(REA.FEC_HABILITACION, REA.FEC_CIERRE,REA.PLAZO) as dias_restantes, sis.id_sistema "
				+ " from responsable_ejecutora_ambito rea, ambito am, sistema sis"
				+ " where rea.id_ambito = am.id_ambito and sis.id_sistema = am.id_sistema "
				+ " and id_responsable = ? ";

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql,
				idResponsable);

		for (Map<String, Object> rec : lEntidadMaps) {
			ResponsableEjecutoraAmbito obj = new ResponsableEjecutoraAmbito();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setFec_habilitacion((String) rec.get("FEC_HABILITACION"));
			obj.setPlazo((Number) rec.get("PLAZO"));
			obj.setFec_cierre((String) rec.get("FEC_CIERRE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setEstado_registro((String) rec.get("ESTADO_REGISTRO"));
			obj.setDias_restantes((Number) rec.get("DIAS_RESTANTES"));

			list.add(obj);
		}
		return list;
	}

	public Sistema GetSistema(Number idSistema) {
		Sistema obj = null;

		String sql = "SELECT * from sistema where id_sistema = " + idSistema;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Sistema();
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setAcronimo((String) rec.get("ACRONIMO"));
			obj.setCod_etapa((String) rec.get("COD_ETAPA"));

			obj.setAmbitos(this.ObtenerAmbitosPorSistema(obj.getId_sistema()));

		}
		return obj;
	}

	/*
	 * ===========================================================
	 * ===================== censoDAO FIN ====================
	 * ==========================================================
	 */

	public void EliminarParticipante(JspResponsableEdicion obj) {
		// eliminar sin considerar el ambito
		String sql = "call sp_del_responsable("
				+ obj.getResponsable().getId_responsable() + ","
				+ obj.getId_ambito() + ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void ejecutarPrueba(Number id_correo_masivo) {
		String sql = "call MAIL_DIAGNOSTICO.CORREO_MASIVO_PRUEBA("
				+ id_correo_masivo + ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		/*
		 * sql = "SELECT LOWER (SC.CORREO) AS CORREO,"+ "SC.ID_SERVICIO_CIVIL,"+
		 * "SC.DNI,"+ "SC.CLAVE,"+
		 * "NET_CORE.F_HTML_REPLACE_TO_SPANISH (PER.NOMBRES || ' ' || PER.APELLIDO_PATERNO || ' ' || PER.APELLIDO_MATERNO) AS NOMBRES"
		 * + "FROM CENSO.SERVICIO_CIVIL SC "+
		 * "JOIN CENSO.PERSONA PER ON SC.DNI = PER.DNI AND SC.ID_PERSONA = PER.ID_PERSONA"
		 * + "WHERE SC.ID_SERVICIO_CIVIL IN (SELECT ID_SERVICIO_CIVIL"+
		 * "FROM DETALLE_CORREO_MASIVO DCM"+
		 * "WHERE DCM.ID_CORREO = "+id_correo_masivo+" AND DCM.ESTADO = '1')";
		 * List<Map<String, Object>> lSectorMaps =
		 * jdbcTemplate.queryForList(sql); for(Map<String, Object> rec :
		 * lSectorMaps){ Sistema s = new Sistema();
		 * s.setId_sistema((Number)rec.get("ID_SISTEMA"));
		 * s.setDescripcion((String)rec.get("DESCRIPCION"));
		 * s.setAcronimo((String)rec.get("ACRONIMO"));
		 * s.setCon_ambitos((String)rec.get("CON_AMBITOS"));
		 * 
		 * // Se activa el envío del correo a través de Java
		 * SMTPSend.Mail(rec.get("COD_ETAPA"),
		 * rec.get("COD_ETAPA"),"jurguenzambrano@gmail.com"); }
		 */
	}

	public void enviaCorreoMasivo(CorreoRegular correo, String vSqlFiltro) {
		String sql = "call MAIL_DIAGNOSTICO.CORREO_MASIVO_ENVIO(" + vSqlFiltro
				+ ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void ejecutarPruebaCorreo(CorreoRegular correo, String correo_pruebas) {
		String sql = "call MAIL_DIAGNOSTICO.CORREO_REGULAR_PRUEBA('"
				+ correo.getCod_tipo().trim() + "'," + correo.getId_sistema()
				+ "," + correo.getId_ambito() + ",'" + correo_pruebas.trim()
				+ "')";

		/*
		 * @JZM-23012013 Arson Se anula la forma de llamada al SP para poder
		 * obtener los parametros de salida
		 */
		/*
		 * try { jdbcTemplate.update(sql); } catch (DataAccessException e) {
		 * e.printStackTrace(); }
		 */
		sql = "{call MAIL_DIAGNOSTICO.CORREO_REGULAR_PRUEBA(?,?,?,?,?,?)}";
		try {
			conn = this.dataSourceCenso.getConnection();
			callableStatement = conn.prepareCall(sql);

			callableStatement.setString(1, correo.getCod_tipo().trim());
			callableStatement.setInt(2, correo.getId_sistema().intValue());
			callableStatement.setInt(3, correo.getId_ambito().intValue());
			callableStatement.registerOutParameter(4, java.sql.Types.VARCHAR); // PSENDER
			callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); // PSUBJECT
			callableStatement.registerOutParameter(6, java.sql.Types.VARCHAR); // PCONTENIDOFINAL

			System.out
					.println("=========== Enviando correo con los datos ==========");
			System.out.println("call MAIL_DIAGNOSTICO.CORREO_REGULAR_PRUEBA");
			System.out.println("Parametro Input 1 = "
					+ correo.getCod_tipo().trim());
			System.out.println("Parametro Input 2 = "
					+ correo.getId_sistema().intValue());
			System.out.println("Parametro Input 3 = "
					+ correo.getId_ambito().intValue());
			System.out
					.println("Parametro OutPut 4 PSENDER = " + correo_pruebas);
			// System.out.println("Parametro OutPut 5 PSUBJECT = "+callableStatement.getString(5));
			// System.out.println("Parametro OutPut 6 PCONTENIDOFINAL = "+callableStatement.getString(6));

			callableStatement.executeUpdate();

			// Se activa el envío del correo a través de Java
			// TODO falta revisar destinatario del correo
			SMTPSend.Mail(callableStatement.getString(5),
					callableStatement.getString(6), correo_pruebas);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(callableStatement == null)) {
				try {
					callableStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

	public void ejecutarEnvio(Number id_correo_masivo, String dniUsuario) {
		// String sql = "call MAIL_DIAGNOSTICO.CORREO_MASIVO_ENVIO(" +
		// id_correo_masivo + ")";
		String sql = "SELECT DCM.ID_SERVICIO_CIVIL, SC.CORREO "
				+ "FROM CORREO_MASIVO CM, DETALLE_CORREO_MASIVO DCM, SERVICIO_CIVIL SC "
				+ "WHERE     CM.ID_CORREO = DCM.ID_CORREO "
				+ "  AND DCM.ID_SERVICIO_CIVIL = SC.ID_SERVICIO_CIVIL "
				+ "AND DCM.ESTADO = '1' " + "AND CM.ENVIADO = 0 "
				+ "AND CM.COD_USUARIO = ?";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql,
				dniUsuario);

		for (Map<String, Object> rec : lSectorMaps) {
			try {
				sql = "{call MAIL_DIAGNOSTICO.DATOS_CORREO(?,?,?,?)}";
				conn = this.dataSourceCenso.getConnection();
				callableStatement = conn.prepareCall(sql);
				callableStatement.setBigDecimal(1,
						(BigDecimal) rec.get("ID_SERVICIO_CIVIL"));
				callableStatement.setLong(2, id_correo_masivo.longValue());
				callableStatement.registerOutParameter(3,
						java.sql.Types.VARCHAR); // PSENDER
				callableStatement.registerOutParameter(4,
						java.sql.Types.VARCHAR); // PRECIPIENT
				callableStatement.executeUpdate();
				System.out.println("X_ID_SERVICIO_CIVIL : "
						+ rec.get("ID_SERVICIO_CIVIL"));
				System.out.println("X_ID_CORREO         : " + id_correo_masivo);
				System.out.println("X_SUBJECT           : "
						+ callableStatement.getString(3));
				System.out.println("X_CONTENIDOFINAL    : "
						+ callableStatement.getString(4));
				// Se activa el envío del correo a través de Java
				SMTPSend.Mail(callableStatement.getString(3),
						callableStatement.getString(4),
						(String) rec.get("CORREO"));
				System.out.println("Correo enviado.");
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if (!(callableStatement == null)) {
					try {
						callableStatement.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(conn == null)) {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}

	public void eliminarCandidato(Integer idServicioCivil, String dniUsuario) {
		String sql = "delete from CANDIDATO_PARTICIPANTE where ID_SERVICIO_CIVIL = "
				+ idServicioCivil + " and  COD_USUARIO = '" + dniUsuario + "'";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}

	}

	public void habilitarPrueba(Integer idTest) {
		String sql = "call EXAMEN.HABILITAR_TEST_MASIVO(" + idTest.toString()
				+ ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void iniciarPrueba(Integer idTest) {
		String sql = "call EXAMEN.INICIALIZAR_TEST_MASIVO(" + idTest.toString()
				+ ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void informarPrueba(Integer idTest) {
		String sql = "call EXAMEN.INFORMAR_TEST_MASIVO(" + idTest.toString()
				+ ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void generarPrueba(Integer idTest) {
		String sql = "call EXAMEN.GENERAR_TEST_MASIVO(" + idTest.toString()
				+ ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void calificarPrueba(Integer idTest) {
		String sql = "call EXAMEN.CALIFICAR_TEST_MASIVO(" + idTest.toString()
				+ ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public Responsable GetResponsablePorEjecutora(Number idEjecutora) {
		Responsable obj = null;

		String sql = "SELECT res.ID_RESPONSABLE, res.DNI, res.CORREO, COD_PROFESION, res.COD_REGIMEN, CLAVE, res.ESTADO, res.COD_ROL_RESPONSABLE,"
				+ " res.TELEFONO, res.ID_PERSONA, res.DNIPREVIO, res.ID_DIAGNOSTICO,"
				+ " (select count(id_servicio_civil) from servicio_civil"
				+ " where id_ejecutora = rea.id_ejecutora) as inscritos,"
				+ " TO_CHAR(REA.FEC_FIN_CENSO,'DD/MM/YYYY') AS FEC_FIN_CENSO"
				+ " FROM RESPONSABLE res join responsable_ejecutora_ambito rea "
				+ " on res.id_responsable = rea.id_responsable "
				+ " join ejecutora ej on ej.id_ejecutora = rea.id_ejecutora "
				+ " where rea.id_ejecutora = " + idEjecutora.toString();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);
		System.out.println(sql);
		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Responsable();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setDni((String) rec.get("DNI"));
			obj.setCorreo(((String) rec.get("CORREO")).toLowerCase());
			obj.setCod_profesion((String) rec.get("COD_PROFESION"));
			obj.setCod_regimen((String) rec.get("COD_REGIMEN"));
			obj.setClave((String) rec.get("CLAVE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setCod_rol_responsable((String) rec.get("COD_ROL_RESPONSABLE"));
			obj.setTelefono((String) rec.get("TELEFONO"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			Number insc = ((Number) rec.get("INSCRITOS"));
			obj.setInscritos(insc.intValue());
			obj.setFec_fin_censo((String) rec.get("FEC_FIN_CENSO"));
		}
		return obj;
	}

	// Metodo para Registrar Persona
	public Integer RegistrarPersona(Persona obj) {
		// Verificamos si existe el registro de la persona
		Integer seq = 0;
		String sql = "select count(*)  from persona where dni = ? and id_persona = ?";
		int iCont = jdbcTemplate.queryForInt(sql, obj.getDni(),
				obj.getId_persona());

		if (iCont == 0) {
			System.out.println("rpm = " + obj.getRpmrpc());
			sql = "SELECT SEQ_ID_PERSONA.nextval FROM DUAL";
			seq = jdbcTemplate.queryForInt(sql);
			sql = "INSERT INTO PERSONA(DNI, NOMBRES, APELLIDO_PATERNO"
					+ ", APELLIDO_MATERNO, FEC_NACIMIENTO, SEXO, COD_TIPO_DOC,"
					+ "ESTADO_VALIDACION,FEC_VALIDACION,ROL_VALIDACION "
					+ ", TELEFONO,ANEXO,FAX,CELULAR,RPMRPC,COMENTARIOS, id_persona) "
					+ " VALUES(?,upper(?),upper(?),upper(?),TO_DATE(?,'DD/MM/YYYY'),?,?,?,?,?,"
					+ " ?,?,?,?,?,?," + seq.toString() + ") ";
			jdbcTemplate.update(sql, obj.getDni(), obj.getNombres(),
					obj.getApellido_paterno(), obj.getApellido_materno(),
					obj.getFec_nacimiento(), obj.getSexo(),
					obj.getCod_tipo_doc(), obj.getEstado_validacion(),
					obj.getFec_validacion(), obj.getRol_validacion(),
					obj.getTelefono(), obj.getAnexo(), obj.getFax(),
					obj.getCelular(), obj.getRpmrpc(), obj.getComentarios());

		} else {
			seq = obj.getId_persona().intValue();
			// Actualizamos el registro
			sql = "UPDATE PERSONA SET NOMBRES= upper(?), APELLIDO_PATERNO= upper(?)"
					+ ", APELLIDO_MATERNO= upper(?), FEC_NACIMIENTO= to_date(?,'DD/MM/YYYY'), SEXO = ?, COD_TIPO_DOC = ? ,"
					+ " ESTADO_VALIDACION = ?,FEC_VALIDACION = to_date(?,'DD/MM/YYYY'),ROL_VALIDACION = ?, "
					+ " TELEFONO = ?,ANEXO = ?,FAX = ?,CELULAR = ?, RPMRPC = ?,COMENTARIOS=? "
					+ " WHERE trim(DNI) = trim(?) and id_persona = ?";
			jdbcTemplate.update(sql, obj.getNombres(),
					obj.getApellido_paterno(), obj.getApellido_materno(),
					obj.getFec_nacimiento(), obj.getSexo(),
					obj.getCod_tipo_doc(), obj.getEstado_validacion(),
					obj.getFec_validacion(), obj.getRol_validacion(),
					obj.getTelefono(), obj.getAnexo(), obj.getFax(),
					obj.getCelular(), obj.getRpmrpc(), obj.getComentarios(),
					obj.getDni(), obj.getId_persona());
		}
		return seq;
	}

	// Grabar Nuevo Responsable
	public Integer grabarNuevoResponsable(JspResponsableEdicion obj) {
		// grabar datos de persona
		String sql = "";
		int idEjecutora = 0;
		int idResponsable = 0;
		// *************************************
		// Registramos los datos de la persona
		// *************************************
		int seq_id_persona = this.RegistrarPersona(obj.getPersona());

		// Obtener IdResponsable
		sql = "SELECT SEQ_ID_RESPONSABLE.NEXTVAL from dual";
		idResponsable = jdbcTemplate.queryForInt(sql);

		// grabar responsable
		sql = "INSERT into responsable (correo, cod_profesion, cod_regimen, id_responsable, "
				+ " DNI, ESTADO, COD_ROL_RESPONSABLE,CLAVE, ID_PERSONA, DNIPREVIO, id_diagnostico, fec_registro, "
				+ " NOMBREPUESTO, CONFIANZA, PERTENECERRHH, ENADICION, ESTADOENPUESTO )"
				+ " values ("
				+ " ?,?,?,?,?,'1','RESP',null,"
				+ seq_id_persona
				+ ",?,?, sysdate, " + "?,?,?,?,? )";
		jdbcTemplate.update(sql, obj.getResponsable().getCorreo(), obj
				.getResponsable().getCod_profesion(), obj.getResponsable()
				.getCod_regimen(), idResponsable, obj.getPersona().getDni(),
				obj.getPersona().getDni(), obj.getResponsable()
						.getId_diagnostico(), obj.getResponsable()
						.getNombrepuesto(),
				obj.getResponsable().getConfianza(), obj.getResponsable()
						.getPertencerrhh(),
				obj.getResponsable().getEnadicion(), obj.getResponsable()
						.getEstadoenpuesto());

		// grabar datos de la Entidad

		// grabarEjecutora(obj.getEjecutora());
		idEjecutora = obj.getEjecutora().getId_ejecutora().intValue();

		// TODO Verificar como tratar el tema de cambios de entidades
		// Registramos la relacion responsable_ejecutora_ambito
		// sql =
		// "Select count(*) from RESPONSABLE_EJECUTORA_AMBITO where ID_EJECUTORA = ? and id_responsable = ? and id_ambito = ?";
		// int iCont =
		// jdbcTemplate.queryForInt(sql,idEjecutora,idResponsable,obj.getId_ambito());

		// se borra toda relacion de RESPONSABLE_EJECUTORA_AMBITO
		sql = "DELETE FROM RESPONSABLE_EJECUTORA_AMBITO WHERE ID_RESPONSABLE = ? AND ID_AMBITO = ? ";
		jdbcTemplate.update(sql, idResponsable, obj.getId_ambito());

		// Cualquier registro en RESPONSABLE_EJECUTORA_AMBITO previo pasa a
		// ESTADO = 0 y es retomado por este.
		// sql =
		// "update RESPONSABLE_EJECUTORA_AMBITO set ESTADO = '0', ESTADO_REGISTRO = '0' "
		// +
		// " where id_ejecutora = " + obj.getEjecutora().getId_ejecutora() +
		// " and id_ambito = "+ obj.getId_ambito();
		// jdbcTemplate.update(sql);

		// if (iCont == 0) {
		sql = "INSERT INTO RESPONSABLE_EJECUTORA_AMBITO (ID_EJECUTORA,ID_RESPONSABLE, ID_AMBITO, ESTADO,FEC_ASIGNACION, ESTADO_REGISTRO) values "
				+ "  (?,?,?,'1',SYSDATE, '0') ";
		jdbcTemplate
				.update(sql, idEjecutora, idResponsable, obj.getId_ambito());
		/*
		 * } else{
		 * 
		 * sql =
		 * "UPDATE RESPONSABLE_EJECUTORA_AMBITO set FEC_ASIGNACION = SYSDATE, FEC_HABILITACION = to_date(?,'DD/MM/YYYY'), PLAZO = ?,FEC_CIERRE = f_obtener_fecha_cierre(to_date(?,'DD/MM/YYYY'),?),ESTADO_REGISTRO = ? "
		 * +
		 * "  where id_ejecutora = ? and id_responsable = ? and id_ambito = ? "
		 * ; jdbcTemplate.update(sql,
		 * obj.getFec_habilitacion(),obj.getPlazo(),obj
		 * .getFec_habilitacion(),obj
		 * .getPlazo(),obj.getEstado_habilitado(),idEjecutora, idResponsable,
		 * obj.getId_ambito());
		 * 
		 * 
		 * sql =
		 * "UPDATE RESPONSABLE_EJECUTORA_AMBITO set FEC_HABILITACION = to_date(?,'DD/MM/YYYY'), PLAZO = ?,FEC_CIERRE = f_obtener_fecha_cierre(to_date(?,'DD/MM/YYYY'),?),ESTADO_REGISTRO = ? "
		 * +
		 * "  where id_ejecutora = ? and id_responsable = ? and id_ambito = ? "
		 * ; jdbcTemplate.update(sql,
		 * obj.getFec_hMIGUabilitacion(),obj.getPlazo(
		 * ),obj.getFec_habilitacion()
		 * ,obj.getPlazo(),obj.getEstado_habilitado(),idEjecutora,
		 * idResponsable, obj.getId_ambito()); }
		 */
		/*
		 * if (obj.getEstado_habilitado() != null &&
		 * obj.getEstado_habilitado().intValue() == 1) { sql =
		 * "call correo_habilitacion(" +
		 * obj.getResponsable().getId_responsable() + "," + obj.getId_ambito() +
		 * ")"; try { jdbcTemplate.update(sql); } catch (DataAccessException e)
		 * { e.printStackTrace(); } //call
		 * correo_habilitacion(id_responsable,id_ambito) }
		 */

		return idResponsable;

	}

	// Grabar Nuevo Responsable para el cual ya existe la persona
	public Integer grabarResponsablePersona(JspResponsableEdicion obj) {
		// grabar datos de persona
		String sql = "";
		int idEjecutora = 0;
		int idResponsable = 0;
		// *************************************
		// Registramos los datos de la persona
		// *************************************
		int seq_id_persona = this.RegistrarPersona(obj.getPersona());

		// Obtener IdResponsable
		sql = "SELECT SEQ_ID_RESPONSABLE.NEXTVAL from dual";
		idResponsable = jdbcTemplate.queryForInt(sql);

		// grabar responsable
		sql = "INSERT into responsable (correo, cod_profesion, cod_regimen, id_responsable, "
				+ " DNI, ESTADO, COD_ROL_RESPONSABLE,CLAVE, ID_PERSONA, DNIPREVIO, id_diagnostico, fec_registro) values ("
				+ " ?,?,?,?,?,'1','RESP',null,"
				+ seq_id_persona
				+ ",?,?, sysdate) ";
		jdbcTemplate.update(sql, obj.getResponsable().getCorreo(), obj
				.getResponsable().getCod_profesion(), obj.getResponsable()
				.getCod_regimen(), idResponsable, obj.getPersona().getDni(),
				obj.getPersona().getDni(), obj.getResponsable()
						.getId_diagnostico());

		// grabar datos de la Entidad

		// grabarEjecutora(obj.getEjecutora());
		idEjecutora = obj.getEjecutora().getId_ejecutora().intValue();

		// TODO Verificar como tratar el tema de cambios de entidades
		// Registramos la relacion responsable_ejecutora_ambito
		// sql =
		// "Select count(*) from RESPONSABLE_EJECUTORA_AMBITO where ID_EJECUTORA = ? and id_responsable = ? and id_ambito = ?";
		// int iCont =
		// jdbcTemplate.queryForInt(sql,idEjecutora,idResponsable,obj.getId_ambito());

		// se borra toda relacion de RESPONSABLE_EJECUTORA_AMBITO
		sql = "DELETE FROM RESPONSABLE_EJECUTORA_AMBITO WHERE ID_RESPONSABLE = ? AND ID_AMBITO = ? ";
		jdbcTemplate.update(sql, idResponsable, obj.getId_ambito());

		// Cualquier registro en RESPONSABLE_EJECUTORA_AMBITO previo pasa a
		// ESTADO = 0 y es retomado por este.
		// sql =
		// "update RESPONSABLE_EJECUTORA_AMBITO set ESTADO = '0', ESTADO_REGISTRO = '0' "
		// +
		// " where id_ejecutora = " + obj.getEjecutora().getId_ejecutora() +
		// " and id_ambito = "+ obj.getId_ambito();
		// jdbcTemplate.update(sql);

		// if (iCont == 0) {
		sql = "INSERT INTO RESPONSABLE_EJECUTORA_AMBITO (ID_EJECUTORA,ID_RESPONSABLE, ID_AMBITO, ESTADO,FEC_ASIGNACION, ESTADO_REGISTRO) values "
				+ "  (?,?,?,'1',SYSDATE, '0') ";
		jdbcTemplate
				.update(sql, idEjecutora, idResponsable, obj.getId_ambito());
		/*
		 * } else{
		 * 
		 * sql =
		 * "UPDATE RESPONSABLE_EJECUTORA_AMBITO set FEC_ASIGNACION = SYSDATE, FEC_HABILITACION = to_date(?,'DD/MM/YYYY'), PLAZO = ?,FEC_CIERRE = f_obtener_fecha_cierre(to_date(?,'DD/MM/YYYY'),?),ESTADO_REGISTRO = ? "
		 * +
		 * "  where id_ejecutora = ? and id_responsable = ? and id_ambito = ? "
		 * ; jdbcTemplate.update(sql,
		 * obj.getFec_habilitacion(),obj.getPlazo(),obj
		 * .getFec_habilitacion(),obj
		 * .getPlazo(),obj.getEstado_habilitado(),idEjecutora, idResponsable,
		 * obj.getId_ambito());
		 * 
		 * 
		 * sql =
		 * "UPDATE RESPONSABLE_EJECUTORA_AMBITO set FEC_HABILITACION = to_date(?,'DD/MM/YYYY'), PLAZO = ?,FEC_CIERRE = f_obtener_fecha_cierre(to_date(?,'DD/MM/YYYY'),?),ESTADO_REGISTRO = ? "
		 * +
		 * "  where id_ejecutora = ? and id_responsable = ? and id_ambito = ? "
		 * ; jdbcTemplate.update(sql,
		 * obj.getFec_hMIGUabilitacion(),obj.getPlazo(
		 * ),obj.getFec_habilitacion()
		 * ,obj.getPlazo(),obj.getEstado_habilitado(),idEjecutora,
		 * idResponsable, obj.getId_ambito()); }
		 */
		/*
		 * if (obj.getEstado_habilitado() != null &&
		 * obj.getEstado_habilitado().intValue() == 1) { sql =
		 * "call correo_habilitacion(" +
		 * obj.getResponsable().getId_responsable() + "," + obj.getId_ambito() +
		 * ")"; try { jdbcTemplate.update(sql); } catch (DataAccessException e)
		 * { e.printStackTrace(); } //call
		 * correo_habilitacion(id_responsable,id_ambito) }
		 */

		return idResponsable;

	}

	// Metodo para obtneer el ultiom id
	public Number GetLastIdServicioCivil() {
		Number idServicioCivil = 1;
		// try {
		String sSQL = "select seq_id_servicio_civil.NEXTVAL as id_servicio_civil from dual";
		List<Map<String, Object>> lTGMaps = jdbcTemplate.queryForList(sSQL);
		for (Map<String, Object> obj : lTGMaps) {
			idServicioCivil = (Number) obj.get("id_servicio_civil");
		}
		/*
		 * } catch (Exception e) {
		 * 
		 * }
		 */
		idServicioCivil = idServicioCivil.intValue();
		return idServicioCivil;
	}

	// Metodos previos para grabar Responsable
	public void crearServicioCivilResponsable(JspResponsableEdicion obj) {

		// String sql = "call sp_del_servicio_civil_res(?,?,?)";
		// jdbcTemplate.update(sql, obj.getPersona().getDni(),
		// obj.getPersona().getId_persona(), obj.getId_ambito());

		String sql = "";

		Number idServicioCivil = this.GetLastIdServicioCivil();

		sql = "INSERT into servicio_civil(estado_equipo, id_servicio_civil,correo,telefono,id_ejecutora,cod_profesion,cod_regimen,clave, fec_registro, cod_estado,dni, dniprevio, jefe, id_persona, id_responsable,id_puesto_tipo"
				+ ",ANEXO,FAX,CELULAR,RPMRPC,COMENTARIOS ) " + " select '1', "
				+ idServicioCivil
				+ " id_servicio_civil,correo,'"
				+ obj.getPersona().getTelefono()
				+ "',(select max(id_ejecutora) from responsable_ejecutora_ambito ram where ram.id_responsable = r.id_responsable) as id_ejecutora"
				+ " ,cod_profesion,cod_regimen,clave, sysdate fec_registro,'VALI' cod_estado,dni,dni,1 jefe, "
				+ obj.getPersona().getId_persona()
				+ " id_persona,  r.id_responsable "
				+ " ,(select min(pt.id_puesto_tipo) from puesto_tipo pt join ambito am on pt.id_sistema = am.id_sistema where am.id_ambito = "
				+ obj.getId_ambito()
				+ " and es_responsable = '1') as id_puesto_tipo,"
				+ obj.getPersona().getAnexo()
				+ ","
				+ obj.getPersona().getFax()
				+ ","
				+ obj.getPersona().getCelular()
				+ ","
				+ "'"
				+ obj.getPersona().getRpmrpc()
				+ "',"
				+ "'"
				+ obj.getPersona().getComentarios().trim()
				+ "'"
				+ " from responsable r "
				+ " where id_responsable = "
				+ obj.getResponsable().getId_responsable();
		System.out.println("crearServicioCivilResponsable =======");
		System.out.println(sql);
		jdbcTemplate.update(sql);

		sql = "INSERT into servicio_civil_ambito(ID_SERVICIO_CIVIL, ID_AMBITO) "
				+ " VALUES(?,?) ";
		jdbcTemplate.update(sql, idServicioCivil, obj.getId_ambito());

		sql = "insert into servicio_civil_actividad(id_servicio_civil,id_actividad)"
				+ " Select "
				+ idServicioCivil
				+ " ,a.id_actividad from actividad a, funcion f, etapa e"
				+ " where a.id_funcion = f.id_funcion "
				+ " and f.id_etapa = e.id_etapa"
				+ " and e.id_ambito = "
				+ obj.getId_ambito();
		jdbcTemplate.update(sql);

	}

	public void actualizarServicioCivilResponsable(JspResponsableEdicion obj) {

		String sql = "";
		sql = "update servicio_civil set correo = upper(?), id_ejecutora = ?, cod_profesion = ? ,cod_regimen = ?,"
				+ "clave = ?, fec_registro=sysdate, dni = ?, dniprevio= ?, jefe=1, estado_equipo = '1', id_persona = ?, id_responsable = ? "
				+ ", TELEFONO = ?,ANEXO = ?,FAX = ?,CELULAR = ?, RPMRPC = ?,COMENTARIOS=? "
				+ " where id_servicio_civil = "
				+ obj.getServicioCivil().getId_servicio_civil();
		jdbcTemplate.update(sql, obj.getResponsable().getCorreo(), obj
				.getEjecutora().getId_ejecutora(), obj.getResponsable()
				.getCod_profesion(), obj.getResponsable().getCod_regimen(), obj
				.getResponsable().getClave(), obj.getResponsable().getDni(),
				obj.getResponsable().getDni(), obj.getResponsable()
						.getId_persona(), obj.getResponsable()
						.getId_responsable(), obj.getPersona().getTelefono(),
				obj.getPersona().getAnexo(), obj.getPersona().getFax(), obj
						.getPersona().getCelular(), obj.getPersona()
						.getRpmrpc(), obj.getPersona().getComentarios());

		sql = "delete from servicio_civil_actividad where id_servicio_civil = "
				+ obj.getServicioCivil().getId_servicio_civil();
		jdbcTemplate.update(sql);

		sql = "insert into servicio_civil_actividad(id_servicio_civil,id_actividad)"
				+ " Select "
				+ obj.getServicioCivil().getId_servicio_civil()
				+ " ,a.id_actividad from actividad a, funcion f, etapa e"
				+ " where a.id_funcion = f.id_funcion "
				+ " and f.id_etapa = e.id_etapa"
				+ " and e.id_ambito = "
				+ obj.getId_ambito();
		jdbcTemplate.update(sql);

	}

	public void eliminarParticipante(Integer idParticipante) {
		String sql = "";
		/*
		 * Se añade còdigo para eliminar los datos de los test generados
		 * Validarlos con Servir
		 */
		sql = "DELETE PREGUNTAS_GENERADAS WHERE ID_TEST_GENERADO = (SELECT ID_TEST_GENERADO FROM TEST_GENERADO WHERE ID_PARTICIPANTE="
				+ idParticipante.toString() + ")";
		jdbcTemplate.update(sql);
		sql = "DELETE TEST_RESULTADO WHERE ID_TEST_GENERADO = (SELECT ID_TEST_GENERADO FROM TEST_GENERADO WHERE ID_PARTICIPANTE="
				+ idParticipante.toString() + ")";
		jdbcTemplate.update(sql);
		sql = "delete TEST_GENERADO WHERE ID_PARTICIPANTE = "
				+ idParticipante.toString();
		jdbcTemplate.update(sql);

		sql = "delete PARTICIPANTE_FUNCION where id_participante = "
				+ idParticipante.toString();
		jdbcTemplate.update(sql);

		sql = "delete PARTICIPANTE_CASO_ESPECIAL where id_participante = "
				+ idParticipante.toString();
		jdbcTemplate.update(sql);

		sql = "delete participante where id_participante = "
				+ idParticipante.toString();
		jdbcTemplate.update(sql);

	}

	public void eliminarCandidatos(String vSqlOfi, String dniUsuario) {
		StringBuilder sql = new StringBuilder();
		sql.append("delete from CANDIDATO_PARTICIPANTE where cod_usuario = '");
		sql.append(dniUsuario);
		sql.append("' and id_servicio_civil in  (select sql.id_servicio_civil from (");
		sql.append(vSqlOfi);
		sql.append(") sql)");
		jdbcTemplate.update(sql.toString());
	}

	public void eliminarDestinarioCorreo(Integer idServicioCivil,
			String dniUsuario) {
		StringBuilder sql = new StringBuilder();
		sql.append("delete from DETALLE_CORREO_MASIVO where id_servicio_civil = ");
		sql.append(idServicioCivil.toString());
		sql.append(" and id_correo = (select ID_CORREO from correo_masivo where cod_usuario = '");
		sql.append(dniUsuario);
		sql.append("' and enviado = '0')");
		jdbcTemplate.update(sql.toString());
	}

	public CorreoMasivo getCorreoMasivo(String dniUsuario) {

		CorreoMasivo obj = null;
		// Optenemos el correo activo
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT COD_USUARIO,ENVIADO,to_char(FEC_ENVIO,'DD/MM/YYYY') as FEC_ENVIO,COD_TIPO_CORREO,ID_CORREO,CUERPO,CORREO_PRUEBAS,ASUNTO, nvl(DESTINATARIOS,0) DESTINATARIOS ");
		sql.append(" FROM CORREO_MASIVO WHERE COD_USUARIO = '");
		sql.append(dniUsuario);
		sql.append("' and ENVIADO = '0'");
		System.out.println("getCorreoMasivo");
		System.out.println(sql.toString());
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql
				.toString());
		for (Map<String, Object> rec : collec) {
			obj = new CorreoMasivo();
			obj.setCod_usuario((String) rec.get("COD_USUARIO"));
			obj.setEnviado((String) rec.get("ENVIADO"));
			obj.setFec_envio((String) rec.get("FEC_ENVIO"));
			obj.setCod_tipo_correo((String) rec.get("COD_TIPO_CORREO"));
			obj.setId_correo((Number) rec.get("ID_CORREO"));
			obj.setCuerpo((String) rec.get("CUERPO"));
			obj.setCorreo_pruebas((String) rec.get("CORREO_PRUEBAS"));
			obj.setAsunto((String) rec.get("ASUNTO"));
			obj.setDestinatarios((Number) rec.get("DESTINATARIOS"));
		}

		sql.delete(0, sql.length());
		sql.append(" select count(*) from correo_masivo cm, DETALLE_CORREO_MASIVO dcm ");
		sql.append(" where cm.id_correo = dcm.id_correo and cm.id_correo = ");
		sql.append(obj.getId_correo());
		sql.append(" and dcm.estado = '1'");
		System.out.println(sql.toString());
		obj.setDestinatarios(this.jdbcTemplate.queryForInt(sql.toString()));

		return obj;

	}

	public void eliminarDestinariosCorreo(String desSql, String dniUsuario) {
		StringBuilder sql = new StringBuilder();
		sql.append("delete from DETALLE_CORREO_MASIVO where id_servicio_civil in (select sql.id_servicio_civil from (");
		sql.append(desSql);
		sql.append(") sql)");
		sql.append(" and id_correo = (select ID_CORREO from correo_masivo where cod_usuario = '");
		sql.append(dniUsuario);
		sql.append("' and enviado = '0')");
		jdbcTemplate.update(sql.toString());
	}

	public void confirmarDestinariosCorreo(String desSql, String dniUsuario) {
		StringBuilder sql = new StringBuilder();
		sql.append("update DETALLE_CORREO_MASIVO set ESTADO = 1 where id_servicio_civil in (select sql.id_servicio_civil from (");
		sql.append(desSql);
		sql.append(") sql)");
		sql.append(" and id_correo = (select ID_CORREO from correo_masivo where cod_usuario = '");
		sql.append(dniUsuario);
		sql.append("' and enviado = '0')");
		jdbcTemplate.update(sql.toString());
		System.out.println("confirmarDestinariosCorreo()");
		System.out.println(sql);
	}

	public void oficializarCandidatos(String vSqlOfi, String dniUsuario,
			Integer idTest) {
		StringBuilder sql = new StringBuilder();
		sql.append(" insert into participante(id_participante, id_puesto_tipo, id_sector_pregunta, id_test, id_servicio_civil, id_nivel_gobierno) ");
		sql.append(" select seq_id_participante.nextval as id_participante, ");
		// sql.append(" 		case when sc.jefe = '1' then 10 else 11 end as id_puesto_tipo "
		// );
		sql.append(" 		sc.id_puesto_tipo ");
		sql.append(" 		, case when si.aplica_sector_pregunta = '1' then (case when ej.id_nivel_gobierno = 2 then (select id_sector_pregunta from sector s, pliego p where s.id_sector = p.id_sector and p.id_pliego = ej.id_pliego)");
		sql.append(" 		else (select id_sector_pregunta from nivel_gobierno ng where ng.id_nivel_gobierno = ej.id_nivel_gobierno) end) ");
		sql.append(" 		else 20 end as id_sector_pregunta, ");
		sql.append(idTest.toString());
		sql.append(" as id_test ");
		sql.append(" 		, sc.id_servicio_civil ");
		sql.append(" 		, ej.id_nivel_gobierno ");
		sql.append(" from servicio_civil sc, ejecutora ej, test ts, ambito am, sistema si ");
		sql.append(" where sc.id_ejecutora = ej.id_ejecutora ");
		sql.append(" and sc.id_servicio_civil not in (select id_servicio_civil from participante where evaluado = '1')");
		sql.append(" and ts.id_test = ");
		sql.append(idTest.toString());
		sql.append(" and am.id_ambito = ts.id_ambito and am.id_sistema = si.id_sistema ");
		sql.append(" and id_servicio_civil in (select sql.id_servicio_civil from (");
		sql.append(vSqlOfi);
		sql.append(") sql)");
		jdbcTemplate.update(sql.toString());
		sql.delete(0, sql.length());
		sql.append(" ");

		// Paso 2, insertamos las funciones de los participantes
		sql.append(" insert into participante_funcion(id_participante, id_funcion)");
		sql.append(" Select distinct p.id_participante,act.id_funcion from participante p, servicio_civil sc, servicio_civil_actividad sca, actividad act");
		sql.append(" where p.id_test = ");
		sql.append(idTest);
		sql.append(" and p.id_servicio_civil = sc.id_servicio_civil ");
		sql.append(" and sc.id_servicio_civil = sca.id_servicio_civil");
		sql.append(" and sca.id_actividad = act.id_actividad ");
		sql.append(" and p.id_servicio_civil in (select sql.id_servicio_civil from (");
		sql.append(vSqlOfi);
		sql.append(") sql)");
		sql.append(" order by 1,2");

		jdbcTemplate.update(sql.toString());

		this.eliminarCandidatos(vSqlOfi, dniUsuario);

	}

	public void cargarResultadosBusqueda(String vSql, String dni, Integer tipo) {
		// obtenemos el correo masivo vigente
		StringBuilder sql = new StringBuilder();
		System.out.println("cargarResultadosBusqueda()");
		switch (tipo) {
		case 1:
			Integer id_correo = 0;
			sql.append("select max(id_correo) from correo_masivo where cod_usuario = '"
					+ dni + "' and enviado = '0'");
			id_correo = jdbcTemplate.queryForInt(sql.toString());
			sql.delete(0, sql.length());
			if (id_correo == null || id_correo == 0) {
				sql.append("SELECT SEQ_ID_CORREO.nextval FROM DUAL");
				id_correo = jdbcTemplate.queryForInt(sql.toString());
				sql.delete(0, sql.length());
				// cargar correo_masivo nuevo
				sql.append("insert into correo_masivo (id_correo, cod_usuario, enviado) values(");
				sql.append(id_correo);
				sql.append(",'");
				sql.append(dni);
				sql.append("', '0' )");
				jdbcTemplate.update(sql.toString());
				sql.delete(0, sql.length());
			}
			// eliminar todos los usuarios no confirmados
			// sql = "delete from detalle_correo_masivo where id_correo = " +
			// id_correo + " and estado = '0'";
			// jdbcTemplate.update(sql);
			// cargar detalle_correo_masivo
			sql.append("insert into detalle_correo_masivo (id_servicio_civil, correo, dni, estado, id_correo) ");
			sql.append(" select sc.id_servicio_civil, sc.correo, sc.dni, '0', ");
			sql.append(id_correo);
			sql.append(" from servicio_civil sc,  (");
			sql.append(vSql);
			sql.append(") scp ");
			sql.append(" where sc.id_servicio_civil = scp.id_servicio_civil and sc.id_servicio_civil not in ");
			sql.append(" (select id_servicio_civil from detalle_correo_masivo where id_correo = ");
			sql.append(id_correo);
			sql.append(")");
			jdbcTemplate.update(sql.toString());
			sql.delete(0, sql.length());
			break;
		case 2:
			sql.append("insert into CANDIDATO_PARTICIPANTE (ID_SERVICIO_CIVIL, COD_USUARIO) ");
			sql.append(" select sc.id_servicio_civil, '");
			sql.append(dni);
			sql.append("' from servicio_civil sc,  (");
			sql.append(vSql);
			sql.append(") scp ");
			sql.append(" where sc.id_servicio_civil = scp.id_servicio_civil and sc.id_servicio_civil not in ");
			sql.append(" (select id_servicio_civil from CANDIDATO_PARTICIPANTE where COD_USUARIO = '");
			sql.append(dni);
			sql.append("') and sc.id_servicio_civil not in ");
			sql.append(" (select id_servicio_civil from participante where evaluado = '1')");
			jdbcTemplate.update(sql.toString());
			System.out.println(sql.toString());
			sql.delete(0, sql.length());
			break;
		default:
			break;
		}
	}

	public void grabarResponsable(JspResponsableEdicion obj) {
		// grabar datos de persona
		String sql = "";
		System.out.println("grabarResponsable()");
		System.out.println("DNI : " + obj.getPersona().getDni());
		/*
		 * // vemos si cambio el dni if
		 * (!obj.getPersona().getDni().equals(obj.getDniBase())) { sql =
		 * "UPDATE PERSONA SET DNI = ? " + " WHERE trim(DNI) = trim(?)";
		 * jdbcTemplate.update(sql, obj.getDni(), obj.getDniBase()); }
		 */
		int idEjecutora = 0;
		int idResponsable = 0;
		int idAmbito = 0;
		// *************************************
		// Registramos los datos de la persona
		// *************************************
		// int seq = this.RegistrarPersona(obj.getPersona());
		this.EditPersona(obj.getPersona(), obj.getResponsable().getDniprevio());

		idResponsable = obj.getResponsable().getId_responsable().intValue();
		idAmbito = obj.getId_ambito().intValue();

		// grabar habilitacion
		// select correo, cod_profesion, cod_regimen from responsable
		// id_responsable
		sql = "UPDATE responsable SET correo= upper(?), cod_profesion = ?, "
				+ " cod_regimen = ?, DNI = ? , DNIPREVIO = ?, "
				+ " id_diagnostico = ?, id_persona = ?, "
				+ " NOMBREPUESTO = ?, CONFIANZA = ?, PERTENECERRHH = ?, ENADICION = ?, ESTADOENPUESTO = ? "
				+ " WHERE id_responsable = ?";
		jdbcTemplate.update(sql, obj.getResponsable().getCorreo(), obj
				.getResponsable().getCod_profesion(), obj.getResponsable()
				.getCod_regimen(), obj.getPersona().getDni(), obj.getPersona()
				.getDni(), obj.getResponsable().getId_diagnostico(), obj
				.getResponsable().getId_persona(), obj.getResponsable()
				.getNombrepuesto(), obj.getResponsable().getConfianza(), obj
				.getResponsable().getPertencerrhh(), obj.getResponsable()
				.getEnadicion(), obj.getResponsable().getEstadoenpuesto(), obj
				.getResponsable().getId_responsable());

		// grabar datos de la Entidad
		// sólo es posible actualizar el teléfono de la entidad

		sql = "UPDATE ejecutora SET telefono = ? WHERE id_ejecutora = ?";
		jdbcTemplate.update(sql, obj.getEjecutora().getTelefono(), obj
				.getEjecutora().getId_ejecutora());

		// grabarEjecutora(obj.getEjecutora());
		idEjecutora = obj.getEjecutora().getId_ejecutora().intValue();

		// Registramos la relacion responsable_ejecutora_ambito Considerar que
		// un responsable solo
		// esta asignado a una entidad en un ambito de no se asi habra problemas
		// en la grilla por
		// duplicidad de campo ID

		// se borra toda relacion con otro ejecutora
		String estado_registro = "0";
		if (obj.getResponsable().getEstado_registro() != null)
			estado_registro = obj.getResponsable().getEstado_registro();

		if (estado_registro.equals("NO HABILITADO")) {
			sql = "DELETE FROM RESPONSABLE_EJECUTORA_AMBITO WHERE ID_RESPONSABLE = ? AND ID_AMBITO = ? AND id_ejecutora <> ? ";
			jdbcTemplate.update(sql, idResponsable, obj.getId_ambito(),
					idEjecutora);
		}

		sql = "Select count(*) from RESPONSABLE_EJECUTORA_AMBITO where id_responsable = ? and id_ambito = ?"; // and
																												// id_ambito
																												// =
																												// ?
		int iCont = jdbcTemplate.queryForInt(sql, idResponsable,
				obj.getId_ambito()); // ,obj.getId_ambito()

		/*
		 * if (iCont == 0) { sql =
		 * "INSERT INTO RESPONSABLE_EJECUTORA_AMBITO (ID_EJECUTORA,ID_RESPONSABLE, ID_AMBITO, ESTADO,FEC_HABILITACION, PLAZO,FEC_CIERRE,ESTADO_REGISTRO, FEC_ASIGNACION) values "
		 * +
		 * "  (?,?,?,'1',to_date(?,'DD/MM/YYYY'),?,f_obtener_fecha_cierre(to_date(?,'DD/MM/YYYY'),?),?, SYSDATE) "
		 * ; jdbcTemplate.update(sql, idEjecutora, idResponsable,
		 * obj.getId_ambito
		 * (),obj.getFec_habilitacion(),obj.getPlazo(),obj.getFec_habilitacion
		 * (),obj.getPlazo(),obj.getEstado_habilitado()); } else{ sql =
		 * "UPDATE RESPONSABLE_EJECUTORA_AMBITO set FEC_ASIGNACION = SYSDATE, FEC_HABILITACION = to_date(?,'DD/MM/YYYY'), PLAZO = ?,FEC_CIERRE = f_obtener_fecha_cierre(to_date(?,'DD/MM/YYYY'),?),ESTADO_REGISTRO = ? "
		 * +
		 * "  where id_ejecutora = ? and id_responsable = ? and id_ambito = ? "
		 * ; jdbcTemplate.update(sql,
		 * obj.getFec_habilitacion(),obj.getPlazo(),obj
		 * .getFec_habilitacion(),obj
		 * .getPlazo(),obj.getEstado_habilitado(),idEjecutora, idResponsable,
		 * obj.getId_ambito()); }
		 */

		if (iCont == 0) {
			sql = "INSERT INTO RESPONSABLE_EJECUTORA_AMBITO (ID_EJECUTORA,ID_RESPONSABLE, ID_AMBITO, ESTADO,ESTADO_REGISTRO, FEC_ASIGNACION) values "
					+ "  (?,?,?,'1','0',SYSDATE) ";
			jdbcTemplate.update(sql, idEjecutora, idResponsable,
					obj.getId_ambito());
		} else {
			sql = "UPDATE RESPONSABLE_EJECUTORA_AMBITO set id_ejecutora = ?, id_ambito = ?"
					+ "  where id_responsable = ? ";
			jdbcTemplate.update(sql, idEjecutora, obj.getId_ambito(),
					idResponsable);
		}

		// Actualizar a todos los Operadores Inscritos

		sql = "UPDATE servicio_civil set id_ejecutora = ? where id_responsable = ? ";
		jdbcTemplate.update(sql, idEjecutora, idResponsable);
		System.out.println(sql);
		System.out.println("Parametro id_ejecutora : " + idEjecutora);
		System.out.println("Parametro id_responsable : " + idResponsable);

		// sql =
		// "Select count(*) from RESPONSABLE_EJECUTORA_AMBITO where ID_EJECUTORA = ? and id_responsable = ? and id_ambito = ?";
		// int iCont =
		// jdbcTemplate.queryForInt(sql,idEjecutora,idResponsable,idAmbito);
		// if (iCont == 0) {

		// sql =
		// "UPDATE RESPONSABLE_EJECUTORA_AMBITO SET ESTADO = '0' WHERE ID_RESPONSABLE = ? AND ID_AMBITO = ? ";
		// jdbcTemplate.update(sql, idResponsable, obj.getId_ambito());
		// decidimos eliminar el registro
		// sql =
		// "DELETE FROM RESPONSABLE_EJECUTORA_AMBITO WHERE ID_RESPONSABLE = ? AND ID_AMBITO = ? ";
		// jdbcTemplate.update(sql, idResponsable, obj.getId_ambito());
		// INSERTAMOS LA NUEVA RELACION
		// sql =
		// "INSERT INTO RESPONSABLE_EJECUTORA_AMBITO (ID_EJECUTORA,ID_RESPONSABLE, ID_AMBITO, ESTADO) values "
		// +
		// "  (?,?,?,'1') " ;
		// jdbcTemplate.update(sql, idEjecutora, idResponsable,
		// obj.getId_ambito());
		// }

		if (obj.getServicioCivil() == null) {
			// crearServicioCivilResponsable(obj);
		} else {
			actualizarServicioCivilResponsable(obj);
		}

	}

	public void grabarCorreo(CorreoMasivo obj) {
		String sql = "";
		sql = "UPDATE correo_masivo set asunto = ?, correo_pruebas = ?, cuerpo = ?, destinatarios = ? where id_correo = ?";
		jdbcTemplate.update(sql, obj.getAsunto(), obj.getCorreo_pruebas(),
				obj.getCuerpo(), obj.getDestinatarios(), obj.getId_correo());
	}

	public void grabarCorreoRegular(CorreoRegular correo) {
		String sql = "";
		sql = "UPDATE CORREO_REGULAR set cuerpo= ?, asunto= ? where cod_tipo = ? and id_sistema= ? and id_ambito= ?";
		jdbcTemplate.update(sql, correo.getCuerpo(), correo.getAsunto()
				.toLowerCase(), correo.getCod_tipo(), correo.getId_sistema(),
				correo.getId_ambito());
	}

	public Integer grabarEjecutora(Ejecutora obj) {

		String sql = "";
		Integer idEjecutora = 0;
		System.out.println("grabarEjecutora ==============");
		if (obj.getId_ejecutora() == null
				|| obj.getId_ejecutora().intValue() <= 0) {
			sql = "select seq_id_ejecutora.NEXTVAL from dual";
			idEjecutora = jdbcTemplate.queryForInt(sql);
			// insertamos nueva ejecutora
			// if (obj.getId_nivel_gobierno().intValue() == 2) {
			sql = "INSERT INTO EJECUTORA (id_ejecutora, id_pliego, descripcion, ubigeo, ubigeo_rpt, "
					+ "id_nivel_gobierno, telefono, estado, cod_regimen,direccion) VALUES(?,?,upper(?),?,?,?,?,'1',?,?)";
			jdbcTemplate
					.update(sql, idEjecutora,
							obj.getId_pliego(),
							obj.getDescripcion(),
							obj.getUbigeo(), // obj.getNombre_ejecutora()
							obj.getUbigeo_rpt(), obj.getId_nivel_gobierno(),
							obj.getTelefono(), obj.getCod_regimen(),
							obj.getDireccion());
			// } else {
			// sql =
			// "INSERT INTO EJECUTORA (id_ejecutora, descripcion, ubigeo, ubigeo_rpt, "
			// +
			// "id_nivel_gobierno, telefono, estado, cod_regimen, direccion) VALUES(?,upper(?),?,?,?,?,'1',?,?)";
			// jdbcTemplate.update(sql, idEjecutora,
			// obj.getDescripcion(),
			// obj.getUbigeo(), // obj.getNombre_ejecutora()
			// obj.getUbigeo_rpt(), obj.getId_nivel_gobierno(),
			// obj.getTelefono(), obj.getCod_regimen(),
			// obj.getDireccion());
			// }
		} else {
			idEjecutora = obj.getId_ejecutora().intValue();
			// actualizar datos de la entidad
			// if (obj.getId_nivel_gobierno().intValue() == 2)
			// {
			sql = "UPDATE EJECUTORA set ubigeo = ?, ubigeo_rpt = ?, descripcion = ?, "
					+ "id_nivel_gobierno = ?, telefono = ?, id_pliego = ?, cod_regimen = ?, direccion = ? where id_ejecutora = ?";
			jdbcTemplate.update(sql, obj.getUbigeo(), obj.getUbigeo_rpt(),
					obj.getDescripcion(), obj.getId_nivel_gobierno(),
					obj.getTelefono(), obj.getId_pliego(),
					obj.getCod_regimen(), obj.getDireccion(),
					obj.getId_ejecutora());
			// }
			// else
			// {
			// sql =
			// "UPDATE EJECUTORA set ubigeo = ?, ubigeo_rpt = ?, descripcion = ?, "
			// +
			// "id_nivel_gobierno = ?, telefono = ?, id_pliego = null, cod_regimen = ? where id_ejecutora = ?";
			// jdbcTemplate.update(sql, obj.getUbigeo(), obj.getUbigeo_rpt(),
			// obj.getDescripcion(),
			// obj.getId_nivel_gobierno(), obj.getTelefono()
			// ,obj.getCod_regimen(),
			// obj.getId_ejecutora());
			// }
		}
		System.out.println("idEjecutora = " + idEjecutora);
		return idEjecutora;
	}

	public Integer grabarTest(Test test) {

		StringBuilder sql = new StringBuilder();
		Integer idTest = 0;
		if (test.getId_test() == null || test.getId_test().intValue() <= 0) {
			System.out.println("test.getId_tipo_prueba() : "
					+ test.getId_tipo_prueba());
			sql.append("select seq_id_test.NEXTVAL from dual");
			idTest = jdbcTemplate.queryForInt(sql.toString());
			sql.replace(0, sql.toString().length(), "");
			// insertamos nueva ejecutora
			sql.append(" INSERT INTO test (ID_TEST, ID_BANCO_PREGUNTA, ID_AMBITO, TEST, FH_INICIO, FH_FIN, ACTIVO,");
			sql.append(" COD_EJECUTADO, FEC_ACT, FEC_PROGRAMACION, VALIDO, ID_EXM_PERFIL, FH_ACTIVACION, ID_TIPO_PRUEBA) ");
			sql.append(" VALUES(?,?,?,upper(?),TO_DATE(?,'DD/MM/YYYY HH24:MI'),TO_DATE(?,'DD/MM/YYYY HH24:MI'),'1','0',SYSDATE,TO_DATE(?,'DD/MM/YYYY'),?, ?, TO_DATE(?,'DD/MM/YYYY'),?)");
			jdbcTemplate.update(sql.toString(), idTest,
					test.getId_banco_pregunta(), test.getId_ambito(),
					test.getTest(), test.getFh_inicio(), test.getFh_fin(),
					test.getFec_programacion(), test.getValido(),
					test.getId_exm_perfil(), test.getFec_programacion(),
					test.getId_tipo_prueba());
			sql.delete(0, sql.length());
		} else {
			idTest = test.getId_test().intValue();
			// actualizar datos de la entidad
			sql.append(" update test set ID_BANCO_PREGUNTA = ?, ID_AMBITO = ?, TEST = upper(?), FH_INICIO = TO_DATE(?,'DD/MM/YYYY HH24:MI'), FH_FIN = TO_DATE(?,'DD/MM/YYYY HH24:MI'), ");
			sql.append(" FEC_ACT = SYSDATE, FEC_PROGRAMACION = TO_DATE(?,'DD/MM/YYYY'), FH_ACTIVACION = TO_DATE(?,'DD/MM/YYYY'), VALIDO = ?, ID_EXM_PERFIL = ?, ID_TIPO_PRUEBA = ? WHERE ID_TEST = ");
			sql.append(idTest);
			jdbcTemplate.update(sql.toString(), test.getId_banco_pregunta(),
					test.getId_ambito(), test.getTest(), test.getFh_inicio(),
					test.getFh_fin(), test.getFec_programacion(),
					test.getFec_programacion(), test.getValido(),
					test.getId_exm_perfil(), test.getId_tipo_prueba());
			sql.delete(0, sql.length());
			sql = new StringBuilder();
			sql.append("update test set ACTIVO = 'N'");
			jdbcTemplate.update(sql.toString());
			sql = new StringBuilder();
			sql.append("update test set ACTIVO = 'S' where id_test = ?");
			jdbcTemplate.update(sql.toString(), idTest);

		}
		return idTest;
	}

	public void grabarValidacion(Persona persona) {
		String sql = "";
		sql = "update persona set estado_validacion = '1', fec_validacion = sysdate "
				+ " where dni = ? and id_persona = ?";
		jdbcTemplate.update(sql, persona.getDni(), persona.getId_persona());
		sql = "update servicio_civil set cod_estado = 'VALI' "
				+ " where dni = ? and id_persona = ? ";
		jdbcTemplate.update(sql, persona.getDni(), persona.getId_persona());
	}

	public void grabarInvalidacion(Persona persona) {
		String sql = "";
		sql = "update persona set estado_validacion = '0', fec_validacion = null "
				+ " where dni = ? and id_persona = ?";
		jdbcTemplate.update(sql, persona.getDni(), persona.getId_persona());
		sql = "update servicio_civil set cod_estado = 'CONF' "
				+ " where dni = ? and id_persona = ? ";
		jdbcTemplate.update(sql, persona.getDni(), persona.getId_persona());
	}

	public void grabarDesasignacion(JspResponsableEdicion obj) {

		/*
		 * @JZM-13022013 Arson Correo de Jorge Valer Se anula la actualización
		 * de la ejecutora = 0 a los operadores del responsable desasignado
		 */
		/*
		 * // Actualizar servicio_civil StringBuilder sql = new StringBuilder();
		 * sql.append(
		 * "update servicio_civil set id_ejecutora = 0 where id_responsable = "
		 * ); sql.append(obj.getResponsable().getId_responsable());
		 * jdbcTemplate.update(sql.toString()); // Actualizar
		 * Ejecutora_responsable_ambito sql = new StringBuilder(); sql.append(
		 * "update responsable_ejecutora_ambito set id_ejecutora = 0, ESTADO_REGISTRO = '0' where id_responsable = "
		 * ); sql.append(obj.getResponsable().getId_responsable());
		 * jdbcTemplate.update(sql.toString());
		 */

		/*
		 * @JZM-13022013 Arson Correo de Jorge Valer Sólo debe actualizar los
		 * datos relacionados al responsable
		 */
		String sql = "";
		System.out.println("grabarDesasignacion()");
		sql = "update servicio_civil set id_ejecutora = 0 where id_responsable = ? and id_persona = ? and dni = ?";
		jdbcTemplate.update(sql, obj.getResponsable().getId_responsable(), obj
				.getResponsable().getId_persona(), obj.getResponsable()
				.getDni());
		System.out.println(sql);
		System.out.println("Parametro Id Responsable : "
				+ obj.getResponsable().getId_responsable());
		System.out.println("Parametro Id Persona : "
				+ obj.getResponsable().getId_persona());
		System.out.println("Parametro DNI Persona : "
				+ obj.getResponsable().getDni());

		// Actualiza el id_reponsable=0 de los operadores del responsable
		// desaignado
		sql = "update servicio_civil set id_responsable = 0 where id_responsable = ? and id_persona <> ?";
		jdbcTemplate.update(sql, obj.getResponsable().getId_responsable(), obj
				.getResponsable().getId_persona());
		System.out.println(sql);
		System.out.println("Parametro Id Responsable : "
				+ obj.getResponsable().getId_responsable());
		System.out.println("Parametro Id Persona : "
				+ obj.getResponsable().getId_persona());

		// Actualizar Ejecutora_responsable_ambito
		sql = "update responsable_ejecutora_ambito set id_ejecutora = 0, ESTADO_REGISTRO = '0' where id_responsable = ?";
		jdbcTemplate.update(sql, obj.getResponsable().getId_responsable());
		System.out.println(sql);
		System.out.println("Parametro Id Responsable : "
				+ obj.getResponsable().getId_responsable());
	}

	public void grabarServicioCivilEjecutora(JspResponsableEdicion obj) {
		String sql = "";
		sql = "UPDATE servicio_civil set id_ejecutora = ? where id_responsable = ? ";
		jdbcTemplate.update(sql, obj.getEjecutora().getId_ejecutora(), obj
				.getResponsable().getId_responsable());
	}

	public void grabarServicioCivilResponsable(JspResponsableEdicion obj) {
		String sql = "";
		sql = "UPDATE servicio_civil set id_responsable = ? where id_ejecutora = ? ";
		jdbcTemplate.update(sql, obj.getResponsable().getId_responsable(), obj
				.getEjecutora().getId_ejecutora());
	}

	public void grabarHabilitacion(JspResponsableEdicion obj) {

		String sql = "";

		// registramos al responsable como participante

		if (obj.getServicioCivil() == null)
			crearServicioCivilResponsable(obj);
		else
			actualizarServicioCivilResponsable(obj);

		// Actualizar todos los servicios civil (operadores relacionados al
		// Jefe)

		grabarServicioCivilResponsable(obj);

		// Se pasa a estado = '0' a todos las RESPONSABLE_EJECUTORA_AMBITO de la
		// ejecutora
		System.out.println("grabarHabilitacion()");
		sql = "update RESPONSABLE_EJECUTORA_AMBITO set ESTADO = '0', ESTADO_REGISTRO = '0' "
				+ " where id_ejecutora = "
				+ obj.getEjecutora().getId_ejecutora()
				+ " and id_ambito = "
				+ obj.getId_ambito();
		System.out.println(sql);
		jdbcTemplate.update(sql);

		sql = "update RESPONSABLE_EJECUTORA_AMBITO set FEC_FIN_CENSO=NULL, ESTADO_REGISTRO = '1', ESTADO = '1', FEC_HABILITACION = "
				+ " to_date('"
				+ obj.getFec_habilitacion()
				+ "', 'dd/MM/yyyy'), COD_MODALIDAD = '"
				+ obj.getResponsable().getCodModalidad()
				+ "', "
				+ " plazo = "
				+ obj.getPlazo()
				+ ", FEC_CIERRE = "
				+ " NET_CORE.F_OBTENER_FECHA_CIERRE(to_date( '"
				+ obj.getFec_habilitacion()
				+ "', 'dd/mm/yyyy HH24:MI') , "
				+ obj.getPlazo()
				+ ") where id_responsable = "
				+ obj.getResponsable().getId_responsable()
				+ " and id_ambito = " + obj.getId_ambito();
		System.out.println(sql);
		jdbcTemplate.update(sql);

		/*
		 * @JZM-01022013 Arson Se cambia el estado de los operadores que no
		 * están validados para que puedan ser editados
		 */
		sql = "UPDATE CENSO.SERVICIO_CIVIL SET COD_ESTADO = 'INIC' WHERE ID_RESPONSABLE = "
				+ obj.getResponsable().getId_responsable()
				+ " AND COD_ESTADO <> 'VALI'";
		System.out.println(sql);
		jdbcTemplate.update(sql);

		/*
		 * @JZM-23012013 Arson Se anula la forma de llamada al SP para poder
		 * obtener los parametros de salida
		 */
		// sql = "call MAIL_CENSO.CORREO_HABILITACION(" +
		// obj.getResponsable().getId_responsable() + "," + obj.getId_ambito() +
		// ")";

		try {
			sql = "{call MAIL_CENSO.CORREO_HABILITACION(?,?,?,?,?,?)}";
			conn = this.dataSourceCenso.getConnection();
			callableStatement = conn.prepareCall(sql);

			callableStatement.setLong(1, obj.getResponsable()
					.getId_responsable().longValue());
			callableStatement.setLong(2, obj.getId_ambito().longValue());
			callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); // PSENDER
			callableStatement.registerOutParameter(4, java.sql.Types.VARCHAR); // PRECIPIENT
			callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); // PSUBJECT
			callableStatement.registerOutParameter(6, java.sql.Types.VARCHAR); // PCONTENIDOFINAL
			callableStatement.executeUpdate();
			System.out.println("PARAM1 : "
					+ obj.getResponsable().getId_responsable().longValue());
			System.out.println("PARAM2 : " + obj.getId_ambito().longValue());
			System.out.println("PSENDER : " + callableStatement.getString(3));
			System.out
					.println("PRECIPIENT : " + callableStatement.getString(4));
			System.out.println("PSUBJECT : " + callableStatement.getString(5));
			System.out.println("PCONTENIDOFINAL : "
					+ callableStatement.getString(6));
			// Se activa el envío del correo a través de Java
			SMTPSend.Mail(callableStatement.getString(5),
					callableStatement.getString(6),
					callableStatement.getString(4));
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(callableStatement == null)) {
				try {
					callableStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

	public void grabarInhabilitacion(JspResponsableEdicion obj) {

		String sql = "";
		// registramos al responsable como participante
		sql = "update RESPONSABLE_EJECUTORA_AMBITO set ESTADO_REGISTRO = '0', FEC_HABILITACION = null, cod_modalidad = 'AUTO', "
				+ " plazo = 0, FEC_CIERRE = null where id_responsable = "
				+ obj.getResponsable().getId_responsable()
				+ " and id_ambito = " + obj.getId_ambito();
		jdbcTemplate.update(sql);
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	/*
	 * =========================================================== =========
	 * METODOS PARA RESPONSABLE BUSQUEDA ==============
	 * ==========================================================
	 */

	public LinkedList<GenOption> ObtenerEstadosResponsable() {
		String sql = "select codigo, descripcion from codigo where grupo = 'ERES' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> ObtenerModalidadesResponsables() {
		String sql = "select codigo, descripcion from codigo where grupo = 'MODR' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> obtenerTiposCorreo() {
		String sql = "select codigo, descripcion from codigo where grupo = 'MAIL' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> obtenerTiposCorreoMasivo() {
		String sql = "select codigo, descripcion from codigo where grupo = 'MAIL' and codigo <> 'OBSE' order by orden ";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> ObtenerEstadosOperadores() {
		String sql = "select codigo, descripcion from codigo where grupo = 'EOPE' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> ObtenerPerfiles() {
		String sql = "select codigo, descripcion from codigo where grupo = 'PERF' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> ObtenerEstadosInscritos() {
		String sql = "select codigo, descripcion from codigo where grupo = 'EPIN' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<GenOption> ObtenerEstadosPlazo() {
		String sql = "select codigo, descripcion from codigo where grupo = 'EPLA' order by orden";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<GenOption> obj = new LinkedList<GenOption>();
		for (Map<String, Object> rec : lSectorMaps) {
			GenOption s = new GenOption();
			s.setCodigo((String) rec.get("CODIGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.add(s);
		}
		return obj;
	}

	public List obtenerRptResponsables(String vSql) {
		List listaRptResponsables = null;

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate
				.queryForList(vSql);
		System.out.println(vSql);
		for (Map<String, Object> rec : lEntidadMaps) {
			RptResponsableBusqueda e = new RptResponsableBusqueda();
			e.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			// e.setJefe((String)rec.get("JEFE"));
			e.setDni((String) rec.get("DNI"));
			e.setApellidosNombres((String) rec.get("APELLIDOSNOMBRES"));
			e.setDescripcionEjecutora((String) rec.get("DESCRIPCIONEJECUTORA"));
			e.setH((String) rec.get("H"));
			e.setEstado((String) rec.get("ESTADO"));
			e.setV((String) rec.get("V"));
			e.setActivo((String) rec.get("ACTIVO"));
			e.setSistema((String) rec.get("SISTEMA"));
			if (listaRptResponsables == null)
				listaRptResponsables = new ArrayList();
			listaRptResponsables.add(e);
			e = null;
		}
		return listaRptResponsables;
	}

	public String obtenerRptQueryResponsables(ResponsableBusqueda obj) {
		String estadoRegistro = "";
		String sql = "select r.id_responsable, sc.id_servicio_civil, r.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres, "
				+ " nvl(e.descripcion,'SIN EJECUTORA') as DESCRIPCIONEJECUTORA,  nvl(re.regimen,'SIN REGIMEN') as REGIMENEJECUTORA,case when nvl(p.estado_validacion,'0') = '0' then 'NO' else 'SI' end as v, "
				+
				// " case when nvl(rea.estado_registro, '0') = '0' then 'NO' else 'SI' end as h, "
				// +
				"CASE WHEN TO_DATE(REA.FEC_CIERRE) < TO_DATE(SYSDATE) THEN 'NO' ELSE CASE WHEN NVL(REA.ESTADO_REGISTRO, '0') in ('0','2','3') THEN 'NO' ELSE 'SI' END END AS H,"
				+ " case when nvl(rea.estado,'0') = '0' then 'NO' else 'SI' end as activo, s.acronimo as sistema "
				+ " from responsable r join persona p on r.dni = p.dni and r.id_persona = p.id_persona "
				+ " join responsable_ejecutora_ambito rea on rea.id_responsable = r.id_responsable "
				+ " left join ejecutora e on e.id_ejecutora = rea.id_ejecutora "
				+ " left join censo.REGIMEN_EJECUTORA re on re.cod_regimen = e.cod_regimen "
				+ " left join servicio_civil sc on sc.dni = p.dni and sc.id_persona = p.id_persona and sc.id_ejecutora = rea.id_ejecutora"
				+ " left join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil and sca.id_ambito = rea.id_ambito"
				+ " left join pliego pli on pli.id_pliego = e.id_pliego left join sector sec on sec.id_sector = pli.id_sector "
				+ " left join ambito am on am.id_ambito = rea.id_ambito left join sistema s on s.id_sistema = am.id_sistema "
				+ " where 1 =  1  "; // rea.estado = '1' and
		// se retira la condicion debido a que un responsable no requiere que se
		// verifique el puesto tipo, siempre es jefe
		// and nvl(sc.id_puesto_tipo,12) in (select id_puesto_tipo from
		// puesto_tipo where nvl(es_responsable,'0') = '1' and id_sistema =
		// s.id_sistema)

		// and am.id_ambito = sca.id_ambito

		if (obj.getApellidos_paterno() != null)
			if (!"".equals(obj.getApellidos_paterno()))
				sql += " and p.apellido_paterno like ('%"
						+ obj.getApellidos_paterno() + "%')";
		if (obj.getApellidos_materno() != null)
			if (!"".equals(obj.getApellidos_materno()))
				sql += " and p.apellido_materno like ('%"
						+ obj.getApellidos_materno() + "%')";
		if (obj.getNombres() != null)
			if (!"".equals(obj.getNombres()))
				sql += " and p.nombres like ('%" + obj.getNombres() + "%')";
		if (obj.getDni() != null)
			if (!"".equals(obj.getDni()))
				sql += " and p.dni = '" + obj.getDni() + "'";
		if (obj.getIdNivelGobierno() != null)
			if (obj.getIdNivelGobierno().intValue() != 0)
				sql += " and e.id_nivel_gobierno = " + obj.getIdNivelGobierno()
						+ " ";
		if (obj.getIdSector() != null)
			if (obj.getIdSector().intValue() != 0)
				sql += " and sec.id_sector = " + obj.getIdSector() + " ";
		if (obj.getIdPliego() != null)
			if (obj.getIdPliego().intValue() != 0)
				sql += " and pli.id_pliego = " + obj.getIdPliego() + " ";
		if (obj.getIdEjecutora() != null)
			if (obj.getIdEjecutora().intValue() != 0)
				sql += " and e.id_ejecutora = " + obj.getIdEjecutora() + " ";
		if (obj.getCoddep() != null)
			if (!"0".equals(obj.getCoddep()))
				sql += " and substr(e.ubigeo, 1, 2) = '" + obj.getCoddep()
						+ "' ";
		if (obj.getCodpro() != null)
			if (!"0".equals(obj.getCodpro()))
				sql += " and substr(e.ubigeo, 3, 2) = '" + obj.getCodpro()
						+ "' ";
		if (obj.getCoddis() != null)
			if (!"0".equals(obj.getCoddis()))
				sql += " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddis()
						+ "' ";
		if (obj.getCodRegimen() != null)
			if (!"0".equals(obj.getCodRegimen())
					&& !"".equals(obj.getCodRegimen()))
				sql += " and sc.cod_regimen = '" + obj.getCodRegimen() + "' ";
		if (obj.getCodProfesion() != null)
			if (!"0".equals(obj.getCodProfesion())
					&& !"".equals(obj.getCodRegimen()))
				sql += " and sc.cod_profesion = '" + obj.getCodProfesion()
						+ "' ";
		if (obj.getCodEstadosResponsable() != null) {
			estadoRegistro = obj.getCodEstadosResponsable();
			if (estadoRegistro.equals("REGI")) {
				// sql += " and nvl(rea.estado_registro,'0') = '0' ";
				// sql += " and nvl(p.estado_validacion, '0') = '0' ";
				// sql += " and (nvl(rea.estado_registro,'0') = '0' ";
				sql += " and nvl(p.estado_validacion, '0') = '0' ";
			}
			if (estadoRegistro.equals("VALI")) {
				sql += " and nvl(p.estado_validacion, '0') = '1' ";
				sql += " and nvl(rea.estado_registro,'0') = '0' ";

			}
			if (estadoRegistro.equals("HABI")) {
				sql += " and nvl(p.estado_validacion, '0') = '1' ";
				sql += " and nvl(rea.estado_registro,'0') = '1' ";
			}
			if (estadoRegistro.equals("FINA")) {
				sql += " and nvl(rea.estado_registro,'0') = '2' ";
			}
			if (estadoRegistro.equals("CERR")) {
				sql += " and nvl(rea.estado_registro,'0') = '3' ";
			}
			if (estadoRegistro.equals("TODO") || estadoRegistro.equals("0")) {
				sql += " and nvl(rea.estado_registro,'0') in ('0','1','2','3') ";
			}
		} else {
			sql += " and (nvl(rea.estado_registro,'0') = '0' ";
			sql += " or nvl(p.estado_validacion, '0') = '0') ";
		}

		if (obj.getCodEstadosPlazo() != null) {
			String estadoPlazo = obj.getCodEstadosPlazo();
			if (estadoPlazo.equals("CUMP")) {
				sql += " and rea.fec_cierre < to_date(to_char(sysdate - 1, 'dd/mm/yyyy') || ' 23:59','dd/mm/yyyy HH24:MI') ";
			}
			if (estadoPlazo.equals("VIGE")) {
				sql += " and rea.fec_cierre >= to_date(to_char(sysdate - 1, 'dd/mm/yyyy') || ' 23:59','dd/mm/yyyy HH24:MI') ";
			}

		}
		if (obj.getCorreo() != null)
			if (!"".equals(obj.getCorreo()))
				sql += " and sc.correo like '%" + obj.getCorreo().toString()
						+ "%' ";

		if (obj.getFecRegistro() != null && obj.getFecRegistroFin() != null) {
			if (!"".equals(obj.getFecRegistro())
					&& !"".equals(obj.getFecRegistroFin()))
				sql += " and (r.fec_registro between to_date('"
						+ obj.getFecRegistro()
						+ "','DD/MM/YYYY') and to_date('"
						+ obj.getFecRegistroFin() + "','DD/MM/YYYY'))";
			if (!"".equals(obj.getFecRegistro())
					&& "".equals(obj.getFecRegistroFin()))
				sql += " and to_char(r.fec_registro,'DD/MM/YYYY') = '"
						+ obj.getFecRegistro() + "' ";
			if ("".equals(obj.getFecRegistro())
					&& !"".equals(obj.getFecRegistroFin()))
				sql += " and to_char(r.fec_registro,'DD/MM/YYYY') = '"
						+ obj.getFecRegistroFin() + "' ";
		}

		if (obj.getFecValidacion() != null && obj.getFecValidacionFin() != null) {
			if (!"".equals(obj.getFecValidacion())
					&& !"".equals(obj.getFecValidacionFin()))
				sql += " and (p.fec_validacion between to_date('"
						+ obj.getFecValidacion()
						+ "','DD/MM/YYYY') and to_date('"
						+ obj.getFecValidacionFin() + "','DD/MM/YYYY'))";
			if (!"".equals(obj.getFecValidacion())
					&& "".equals(obj.getFecValidacionFin()))
				sql += " and to_char(p.fec_validacion,'DD/MM/YYYY') = '"
						+ obj.getFecValidacion() + "' ";
			if ("".equals(obj.getFecValidacion())
					&& !"".equals(obj.getFecValidacionFin()))
				sql += " and to_char(p.fec_validacion,'DD/MM/YYYY') = '"
						+ obj.getFecValidacionFin() + "' ";
		}

		if (obj.getFecHabilita() != null && obj.getFecHabilitaFin() != null) {
			if (!"".equals(obj.getFecHabilita())
					&& !"".equals(obj.getFecHabilitaFin()))
				sql += " and (rea.fec_habilitacion between to_date('"
						+ obj.getFecHabilita()
						+ "','DD/MM/YYYY') and to_date('"
						+ obj.getFecHabilitaFin() + "','DD/MM/YYYY'))";
			if (!"".equals(obj.getFecHabilita())
					&& "".equals(obj.getFecHabilitaFin()))
				sql += " and to_char(rea.fec_habilitacion,'DD/MM/YYYY') = '"
						+ obj.getFecHabilita() + "' ";
			if ("".equals(obj.getFecHabilita())
					&& !"".equals(obj.getFecHabilitaFin()))
				sql += " and to_char(rea.fec_habilitacion,'DD/MM/YYYY') = '"
						+ obj.getFecHabilitaFin() + "' ";
		}

		if (obj.getCodEstadosInscritos() != null) {
			String estadoPlazo = obj.getCodEstadosInscritos();
			if (estadoPlazo.equals("CPAR")) {
				sql += " and (select count(*) from servicio_civil sc where sc.id_ejecutora = rea.id_ejecutora and sc.jefe = 0) > 0 ";
			}
			if (estadoPlazo.equals("SPAR")) {
				sql += " and (select count(*) from servicio_civil sc where sc.id_ejecutora = rea.id_ejecutora and sc.jefe = 0) = 0 ";
			}

		}
		if (obj.getIdSistema() != null)
			if (obj.getIdSistema() != 0)
				sql += " and s.id_sistema = " + obj.getIdSistema() + " ";
		if (obj.getIdAmbito() != null)
			if (obj.getIdAmbito() != 0)
				sql += " and am.id_ambito = " + obj.getIdAmbito() + " ";
		
		/* Inicio Arson */
		if (obj.getFiltroSinEjecutora().equals("1")){
			sql += " and REA.ID_EJECUTORA<>0";
		}
		/* Fin Arson */
		sql += " order by rea.fec_asignacion desc  ";

		return sql;
	}

	/*
	 * ============================================================
	 * ================ SERVICIO CIVIL BUSQUEDA ===================
	 * ============================================================
	 */
	public List obtenerRptServicioCivil(String vSql) {
		List listaRptServicioCivil = null;

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate
				.queryForList(vSql);

		for (Map<String, Object> rec : lEntidadMaps) {
			RptServicioCivilBusqueda e = new RptServicioCivilBusqueda();
			e.setId_servicio_civil((Number) rec.get("ID_SERVICIO_CIVIL"));
			e.setJefe((String) rec.get("JEFE"));
			e.setResponsable((String) rec.get("RESPONSABLE"));
			e.setDni((String) rec.get("DNI"));
			e.setEstado_equipo((String) rec.get("ESTADO_EQUIPO"));
			e.setApellidosNombres((String) rec.get("APELLIDOSNOMBRES"));
			e.setDescripcionEjecutora((String) rec.get("DESCRIPCIONEJECUTORA"));
			e.setH((String) rec.get("H"));
			e.setEstado((String) rec.get("COD_ESTADO"));
			e.setV((String) rec.get("V"));
			e.setSistema((String) rec.get("SISTEMA"));
			if (listaRptServicioCivil == null)
				listaRptServicioCivil = new ArrayList();
			listaRptServicioCivil.add(e);
			e = null;
		}
		return listaRptServicioCivil;
	}

	public List ObtenerDestinatariosCorreo(String dni) {
		List listaRptServicioCivil = null;

		String sql = ObtenerQueryDestinatariosCorreo(dni);

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			RptServicioCivilBusqueda e = new RptServicioCivilBusqueda();
			e.setId_servicio_civil((Number) rec.get("ID_SERVICIO_CIVIL"));
			e.setJefe((String) rec.get("JEFE"));
			e.setDni((String) rec.get("DNI"));
			e.setApellidosNombres((String) rec.get("APELLIDOSNOMBRES"));
			e.setDescripcionEjecutora((String) rec.get("DESCRIPCIONEJECUTORA"));
			e.setH((String) rec.get("H"));
			e.setEstado((String) rec.get("COD_ESTADO"));
			e.setV((String) rec.get("V"));
			if (listaRptServicioCivil == null)
				listaRptServicioCivil = new ArrayList();
			listaRptServicioCivil.add(e);
			e = null;
		}
		return listaRptServicioCivil;

	}

	public String ObtenerQueryDestinatariosCorreo(String dni) {

		String sql = "select sc.id_servicio_civil, case when nvl(sc.jefe,'0') = '1' then 'SI' else 'NO' end as jefe, sc.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres,"
				+ " e.descripcion as DESCRIPCIONEJECUTORA, "
				+ " case when nvl(p.estado_validacion,'0') = '0' then 'NO' else 'SI' end as v, "
				+ " case when nvl(sc.estado_observacion, '0') = '0' then 'NO' else 'SI' end as h, "
				+ " sc.cod_estado "
				+ " from servicio_civil sc join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona "
				+ " join ejecutora e on e.id_ejecutora = sc.id_ejecutora "
				+ " left join pliego pli on pli.id_pliego = e.id_pliego left join sector sec on sec.id_sector = pli.id_sector "
				+ " join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil "
				+ " join ambito am on am.id_ambito = sca.id_ambito join sistema s on s.id_sistema = am.id_sistema "
				+ " where sc.id_servicio_civil in (select id_servicio_civil from correo_masivo cm, detalle_correo_masivo dcm "
				+ " where cm.id_correo = dcm.id_correo "
				+ " and dcm.estado = 0 and cm.enviado = 0 and cm.cod_usuario = '"
				+ dni + "') ";
		return sql;
	}

	public List ObtenerServicioCivilBusquedaFromSql(String sql) {
		List listaRptServicioCivil = null;

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			RptServicioCivilBusqueda e = new RptServicioCivilBusqueda();
			e.setId_servicio_civil((Number) rec.get("ID_SERVICIO_CIVIL"));
			e.setJefe((String) rec.get("JEFE"));
			e.setDni((String) rec.get("DNI"));
			e.setApellidosNombres((String) rec.get("APELLIDOSNOMBRES"));
			e.setDescripcionEjecutora((String) rec.get("DESCRIPCIONEJECUTORA"));
			e.setH((String) rec.get("H"));
			e.setEstado((String) rec.get("COD_ESTADO"));
			e.setV((String) rec.get("V"));
			if (listaRptServicioCivil == null)
				listaRptServicioCivil = new ArrayList();
			listaRptServicioCivil.add(e);
			e = null;
		}
		return listaRptServicioCivil;
	}

	public String obtenerRptQueryServicioCivil(ServicioCivilBusqueda obj) {

		/*
		 * String sql =
		 * "select sc.id_servicio_civil, case when nvl(sc.jefe,'0') = '1' then 'SI' else 'NO' end as jefe, sc.dni, "
		 * +
		 * " case when nvl((select count(id_responsable) from responsable where dni = sc.dni and id_persona = sc.id_persona),0) = 0 then 'NO' else 'SI' end as responsable, "
		 * +
		 * " p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres, "
		 * + " nvl(e.descripcion,'SIN ASIGNACIÓN') as DESCRIPCIONEJECUTORA, " +
		 * " case when nvl(p.estado_validacion,'0') = '0' then 'NO' else 'SI' end as v, "
		 * +
		 * " case when nvl(sc.estado_observacion, '0') = '0' then 'NO' when sc.estado_observacion = '1' then 'OB' else 'RE' end as h, "
		 * + " sc.cod_estado " +
		 * " from servicio_civil sc join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona "
		 * + " left join ejecutora e on e.id_ejecutora = sc.id_ejecutora " +
		 * " left join pliego pli on pli.id_pliego = e.id_pliego left join sector sec on sec.id_sector = pli.id_sector "
		 * +
		 * " join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil "
		 * +
		 * " join ambito am on am.id_ambito = sca.id_ambito join sistema s on s.id_sistema = am.id_sistema "
		 * + " where 1 =  1 ";
		 */
		String sql = "select sc.id_servicio_civil,case when nvl(pt.cod_grupo,' ') = 'J' then 'SI' else 'NO' end as jefe, sc.dni, "
				+ " case when nvl(res.dni,0) = sc.dni then 'SI' else 'NO' end as responsable, "
				+ " case when nvl(sc.estado_equipo,'0') = '1' then 'SI' else 'NO' end as ESTADO_EQUIPO, "
				+ " p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as apellidosNombres, "
				+ " nvl(e.descripcion,'SIN ASIGNACIÓN') as DESCRIPCIONEJECUTORA, "
				+ " case when nvl(SC.COD_ESTADO,'0') = 'VALI' then 'SI' else 'NO' end as v, "
				+ " case when nvl(sc.estado_observacion, '0') = '0' then 'NO' when sc.estado_observacion = '1' then 'OB' else 'RE' end as h, "
				+ " sc.cod_estado, s.acronimo as sistema "
				+ " from servicio_civil sc join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona "
				+ " left join puesto_tipo pt on pt.id_puesto_tipo = sc.id_puesto_tipo "
				+ " left join ejecutora e on e.id_ejecutora = sc.id_ejecutora "
				+ " left join pliego pli on pli.id_pliego = e.id_pliego left join sector sec on sec.id_sector = pli.id_sector "
				+ " join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil "
				+ " join ambito am on am.id_ambito = sca.id_ambito join sistema s on s.id_sistema = am.id_sistema "
				+ " left join responsable res on res.id_responsable = sc.id_responsable "
				+ " left join responsable_ejecutora_ambito rea on rea.id_responsable = sc.id_responsable and rea.id_ejecutora = sc.id_ejecutora  "
				+ " where 1 =  1 ";

		if (obj.getApellidos_paterno() != null)
			if (!"".equals(obj.getApellidos_paterno()))
				sql += " and p.apellido_paterno like ('%"
						+ obj.getApellidos_paterno() + "%')";
		if (obj.getApellidos_materno() != null)
			if (!"".equals(obj.getApellidos_materno()))
				sql += " and p.apellido_materno like ('%"
						+ obj.getApellidos_materno() + "%')";
		if (obj.getNombres() != null)
			if (!"".equals(obj.getNombres()))
				sql += " and p.nombres like ('%" + obj.getNombres() + "%')";
		if (obj.getDni() != null)
			if (!"".equals(obj.getDni()))
				sql += " and p.dni = '" + obj.getDni() + "'";
		if (obj.getEstado_equipo() != null)
			if (!"".equals(obj.getEstado_equipo()))
				sql += " and nvl(sc.estado_equipo, '0') = '"
						+ obj.getEstado_equipo() + "'";

		if (obj.getIdNivelGobierno() != null)
			if (obj.getIdNivelGobierno().intValue() != 0)
				sql += " and e.id_nivel_gobierno = " + obj.getIdNivelGobierno()
						+ " ";
		if (obj.getIdSector() != null)
			if (obj.getIdSector().intValue() != 0)
				sql += " and sec.id_sector = " + obj.getIdSector() + " ";
		if (obj.getIdPliego() != null)
			if (obj.getIdPliego().intValue() != 0)
				sql += " and pli.id_pliego = " + obj.getIdPliego() + " ";
		if (obj.getIdEjecutora() != null)
			if (obj.getIdEjecutora().intValue() != 0)
				sql += " and e.id_ejecutora = " + obj.getIdEjecutora() + " ";
		if (obj.getCoddep() != null)
			if (!"0".equals(obj.getCoddep()))
				sql += " and substr(e.ubigeo, 1, 2) = '" + obj.getCoddep()
						+ "' ";
		if (obj.getCodpro() != null)
			if (!"0".equals(obj.getCodpro()))
				sql += " and substr(e.ubigeo, 3, 2) = '" + obj.getCodpro()
						+ "' ";
		if (obj.getCoddis() != null)
			if (!"0".equals(obj.getCoddis()))
				sql += " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddis()
						+ "' ";
		if (obj.getCorreo() != null)
			if (!"".equals(obj.getCorreo()))
				sql += " and sc.correo like '%" + obj.getCorreo().toString()
						+ "%' ";
		if (obj.getFecRegistro() != null && obj.getFecRegistroFin() != null) {
			if (!"".equals(obj.getFecRegistro())
					&& !"".equals(obj.getFecRegistroFin()))
				sql += " and (sc.fec_registro between to_date('"
						+ obj.getFecRegistro()
						+ "','DD/MM/YYYY') and to_date('"
						+ obj.getFecRegistroFin() + "','DD/MM/YYYY'))";
			if (!"".equals(obj.getFecRegistro())
					&& "".equals(obj.getFecRegistroFin()))
				sql += " and to_char(sc.fec_registro,'DD/MM/YYYY') = '"
						+ obj.getFecRegistro() + "' ";
			if ("".equals(obj.getFecRegistro())
					&& !"".equals(obj.getFecRegistroFin()))
				sql += " and to_char(sc.fec_registro,'DD/MM/YYYY') = '"
						+ obj.getFecRegistroFin() + "' ";
		}
		if (obj.getFecValidacion() != null && obj.getFecValidacionFin() != null) {
			if (!"".equals(obj.getFecValidacion())
					&& !"".equals(obj.getFecValidacionFin()))
				sql += " and (to_date(p.fec_validacion) between to_date('"
						+ obj.getFecValidacion()
						+ "','DD/MM/YYYY') and to_date('"
						+ obj.getFecValidacionFin() + "','DD/MM/YYYY'))";
			if (!"".equals(obj.getFecValidacion())
					&& "".equals(obj.getFecValidacionFin()))
				sql += " and to_char(p.fec_validacion,'DD/MM/YYYY') = '"
						+ obj.getFecValidacion() + "' ";
			if ("".equals(obj.getFecValidacion())
					&& !"".equals(obj.getFecValidacionFin()))
				sql += " and to_char(p.fec_validacion,'DD/MM/YYYY') = '"
						+ obj.getFecValidacionFin() + "' ";
		}
		if (obj.getCodRegimen() != null)
			if (!"0".equals(obj.getCodRegimen()))
				sql += " and sc.cod_regimen = '" + obj.getCodRegimen() + "' ";
		if (obj.getCodProfesion() != null)
			if (!"0".equals(obj.getCodProfesion()))
				sql += " and sc.cod_profesion = '" + obj.getCodProfesion()
						+ "' ";
		/*
		 * if (obj.getCodPerfil() != null) if (!"".equals(obj.getCodPerfil())) {
		 * if (obj.getCodPerfil().equals("JEFE")) sql += " and sc.jefe = '1' ";
		 * if (obj.getCodPerfil().equals("OPER")) sql += " and sc.jefe = '0' ";
		 * if (obj.getCodPerfil().equals("RESP")) sql +=
		 * " and exists (select 1 from responsable where dni = sc.dni and id_persona = sc.id_persona) "
		 * ; //if (!obj.getCodPerfil().equals("RESP")) // sql +=
		 * " and not exists (select 1 from responsable where dni = sc.dni and id_persona = sc.id_persona) "
		 * ;
		 * 
		 * }
		 */
		if (obj.getId_puesto_tipo() != null
				&& obj.getId_puesto_tipo().intValue() != 99
				&& obj.getId_puesto_tipo().intValue() != 0
				&& obj.getId_puesto_tipo().intValue() != 98)
			sql += " and sc.id_puesto_tipo = " + obj.getId_puesto_tipo();

		if (obj.getId_puesto_tipo() != null
				&& obj.getId_puesto_tipo().intValue() == 98) {
			sql += " and sc.dni in (select dni from responsable res join responsable_ejecutora_ambito rea "
					+ " on res.id_responsable = rea.id_responsable and rea.id_ejecutora<>0 ";

			if (obj.getIdAmbito() != null) {
				if (obj.getIdAmbito() != 0)
					sql += " and rea.id_ambito = " + obj.getIdAmbito() + ") ";
				else
					sql += ") ";
			} else
				sql += ") ";
		}

		// if (obj.getCoddep() != null)
		// if (!"0".equals(obj.getCoddep()))
		// sql += " and substr(e.ubigeo, 5, 2) = '" + obj.getCoddep() + "' ";

		if (obj.getEstadoRegistro() != null) {
			// REGI NUEVOS
			// VALI VÁLIDOS
			// OBSE OBSERVADOS
			// EVAL EVALUADOS
			// NEVA NO EVALUADOS
			// DUPL DNI DUPLICADOS
			// TODO TODOS

			if (obj.getEstadoRegistro().equals("REGI")) {
				// @Arson se cambia la regla para obtener los registros NUEVOS
				/*
				 * sql += " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
				 * " and nvl(p.estado_validacion, '0') = '0' ";
				 */
				sql += " and SC.COD_ESTADO = 'INIC' ";
			}
			if (obj.getEstadoRegistro().equals("CONF")) {
				// @Arson se cambia la regla para obtener los registros NUEVOS
				/*
				 * sql += " and nvl(sc.estado_observacion,'0') = '0' "; sql +=
				 * " and nvl(p.estado_validacion, '0') = '0' ";
				 */
				sql += " and SC.COD_ESTADO = 'CONF' ";
			}
			if (obj.getEstadoRegistro().equals("VALI")) {
				// @Arson se cambia la regla para obtener los registros
				// validados
				// sql += " and nvl(p.estado_validacion, '0') = '1' ";
				sql += " and SC.COD_ESTADO = 'VALI' ";
			}
			if (obj.getEstadoRegistro().equals("OBSE")) {// 0 Sin observaciones,
															// 1 observacion
															// vigente, 2
															// observacion
															// subsanada
				sql += " and nvl(sc.estado_observacion,'0') != '0' ";
			}
			if (obj.getEstadoRegistro().equals("EVAL")) {
				sql += " and sc.id_servicio_civil in (select id_servicio_civil from participante where evaluado = '1') ";
			}
			if (obj.getEstadoRegistro().equals("NEVA")) {
				sql += " and sc.id_servicio_civil not in (select id_servicio_civil from participante where evaluado = '1') ";
			}
			if (obj.getEstadoRegistro().equals("DUPL")) {

				if (obj.getIdAmbito() != null)
					if (obj.getIdAmbito() != 0)
						sql += " and sc.dni in (select vsql.dni from (select count(ssc.id_servicio_civil), ssc.dni from servicio_civil ssc "
								+ "join servicio_civil_ambito ssca on ssc.id_servicio_civil = ssca.id_servicio_civil and ssca.id_ambito = "
								+ obj.getIdAmbito()
								+ " group by dni, id_persona having count(dni) > 1) vsql) ";
					else
						sql += " and sc.dni in (select vsql.dni from (select count(ssc.id_servicio_civil), ssc.dni from servicio_civil ssc "
								+ "join servicio_civil_ambito ssca on ssc.id_servicio_civil = ssca.id_servicio_civil "
								+ " group by dni, id_persona having count(dni) > 1) vsql) ";

			}
		} else {
			sql += " and nvl(sc.estado_observacion,'0') = '0' ";
			sql += " and nvl(p.estado_validacion, '0') = '0' ";
		}

		// codEstadoResponsable MM3
		// ESTADOS DEL RESPONSABLE
		if (obj.getEstadoResponsable() != null) {
			String estadoRegistro = obj.getEstadoResponsable();
			if (estadoRegistro.equals("REGI")) {
				// sql += " and nvl(p.estado_validacion, '0') = '0' ";
				sql += " and nvl(rea.estado_registro,'0') = '0' ";
			}
			if (estadoRegistro.equals("VALI")) {
				sql += " and nvl(rea.estado_registro,'0') = '0' ";
			}
			if (estadoRegistro.equals("HABI")) {
				sql += " and nvl(rea.estado_registro,'0') = '1' ";
			}
			if (estadoRegistro.equals("FINA")) {
				sql += " and nvl(rea.estado_registro,'0') = '2' ";
			}
			if (estadoRegistro.equals("CERR")) {
				sql += " and nvl(rea.estado_registro,'0') = '3' ";
			}
			if (estadoRegistro.equals("TODO") || estadoRegistro.equals("0")) {
				sql += " and nvl(rea.estado_registro,'0') in ('0','1','2','3') ";
			}
		}
		// else
		// {
		// sql += " and (nvl(rea.estado_registro,'0') = '0' ";
		// sql += " or nvl(p.estado_validacion, '0') = '0') ";
		// }

		if (obj.getIdSistema() != null)
			if (obj.getIdSistema() != 0)
				sql += " and s.id_sistema = " + obj.getIdSistema() + " ";
		if (obj.getIdAmbito() != null)
			if (obj.getIdAmbito() != 0)
				sql += " and am.id_ambito = " + obj.getIdAmbito() + " ";

		/*
		 * @14022013 ARSON Se añade código para el filtro de Operadores
		 * asignados a Prueba
		 */
		if (obj.getFiltroAsignadoPrueba().equals("1")) {
			sql += " AND SC.ID_SERVICIO_CIVIL IN (SELECT ID_SERVICIO_CIVIL FROM CANDIDATO_PARTICIPANTE) ";
		}
		/*
		 * @26022013 Arson Se añade código para filtro de funcion
		 */
		if (!obj.getIdFuncion().equals("0") && !obj.getIdFuncion().isEmpty()
				&& obj.getIdFuncion() != null) {
			sql += " AND 0 ";
			if (obj.getFiltroIncluirFuncion().equals("1"))
				sql += " <> ";
			else
				sql += " = ";
			sql += " (SELECT COUNT (DISTINCT S1.ID_FUNCION) "
					+ " FROM ACTIVIDAD S1 JOIN SERVICIO_CIVIL_ACTIVIDAD S2 ON S1.ID_ACTIVIDAD = S2.ID_ACTIVIDAD "
					+ " WHERE     S1.ID_FUNCION ";
			if (obj.getFiltroIncluirFuncion().equals("1"))
				sql += " <> ";
			else
				sql += " <> ";
			sql += obj.getIdFuncion()
					+ "      AND S2.ID_SERVICIO_CIVIL = SC.ID_SERVICIO_CIVIL) ";
		}

		sql += " order by sc.fec_registro desc  ";
		System.out
				.println("obtenerRptQueryServicioCivil ===================================");
		System.out.println(sql);
		return sql;
	}

	/*
	 * ============================================================
	 * ================ SERVICIO CIVIL EDICION ====================
	 * ============================================================
	 */
	public ResponsableIdentificacion GetResponsableIdentificacion(String dni) {

		ResponsableIdentificacion obj = null;
		String sql = "select r.id_responsable, r.dni, r.correo, r.clave, e.descripcion, "
				+ "p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as nombre, "
				+ " res.id_ejecutora as id_ejecutora, r.cod_rol_responsable, NVL(e.telefono,'SIN DATOS') as telefono, "
				+ " re.regimen "
				+ "from responsable r join responsable_ejecutora_ambito res "
				+ "on r.id_responsable = res.id_responsable LEFT join ejecutora e "
				+ "on e.id_ejecutora = res.id_ejecutora join persona p "
				+ "on p.dni = r.dni and p.dni = '"
				+ dni
				+ "' and r.estado = '1' "
				+ "left join censo.regimen_ejecutora re on re.cod_regimen = e.cod_regimen";
		// "and res.estado = '1'";
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lSectorMaps) {
			obj = new ResponsableIdentificacion();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setCod_rol_responsable((String) rec.get("COD_ROL_RESPONSABLE"));
			obj.setDni((String) rec.get("DNI"));
			obj.setCorreo(((String) rec.get("CORREO")).toLowerCase());
			obj.setClave((String) rec.get("CLAVE"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setNombre((String) rec.get("NOMBRE"));
			obj.setTelefono((String) rec.get("TELEFONO"));
			// obj.setFec_fin_censo((String)rec.get("FEC_FIN_CENSO"));
			// obj.setPlazo((Number)rec.get("PLAZO"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setRegimenEjecutora((String) rec.get("REGIMEN"));
		}
		// Obtenemos los Sistemas y ambitos activos sobre el cual tiene acceso
		sql = "Select s.id_sistema,s.descripcion as sistema,s.acronimo as acronimo_sistema,s.cod_etapa as etapa_sistema,s.con_ambitos"
				+ " , a.id_ambito,a.descripcion as ambito, a.estado as estado_ambito"
				+ " from responsable r join responsable_ejecutora_ambito ra on r.id_responsable = ra.id_responsable"
				+ " join ambito a on ra.id_ambito = a.id_ambito"
				+ " join sistema s on a.id_sistema = s.id_sistema"
				+ " where DNI = '"
				+ dni
				+ "'"
				+ " order by s.descripcion,a.descripcion";
		lSectorMaps = jdbcTemplate.queryForList(sql);

		Number id_sistema_antes = 0;
		Number id_sistema = 0;
		Sistema sistema = null;
		Ambito ambito = null;
		List<Sistema> sistemasActivos = new ArrayList<Sistema>();
		for (Map<String, Object> rec : lSectorMaps) {
			id_sistema = (Number) rec.get("ID_SISTEMA");
			if (id_sistema.intValue() != id_sistema_antes.intValue()) {
				sistema = new Sistema();
				sistema.setId_sistema((Number) rec.get("ID_SISTEMA"));
				sistema.setAcronimo((String) rec.get("ACRONIMO_SISTEMA"));
				sistema.setCod_etapa((String) rec.get("ETAPA_SISTEMA"));
				sistema.setDescripcion((String) rec.get("SISTEMA"));
				sistema.setCon_ambitos((String) rec.get("CON_AMBITOS"));

				sistema.setAmbitos(new ArrayList<Ambito>());

				sistemasActivos.add(sistema);
			}
			ambito = new Ambito();
			ambito.setId_sistema((Number) rec.get("ID_SISTEMA"));
			ambito.setId_ambito((Number) rec.get("ID_AMBITO"));
			ambito.setDescripcion((String) rec.get("AMBITO"));
			ambito.setEstado((String) rec.get("ESTADO"));

			sistema.getAmbitos().add(ambito);

			id_sistema_antes = id_sistema;
		}
		obj.setSistemas_activos(sistemasActivos);

		return obj;
	}

	// Viene de censoDAO
	@Deprecated
	public LinkedList<ResponsableIdentificacion> ObtenerResponsableIdentificacion(
			String dni) {
		String sql = "select r.id_responsable, r.dni, r.correo, r.clave, e.descripcion, "
				+ "p.nombres || ' ' || p.apellido_paterno as nombre "
				+
				// "to_char(e.fec_fin_censo,'dd/MM/YY') as fec_fin_censo, ROUND(e.fec_fin_censo - SYSDATE, 0) as plazo, "
				// +
				" ,res.id_ejecutora as id_ejecutora "
				+ "from responsable r join responsable_ejecutora_ambito res "
				+ "on r.id_responsable = res.id_responsable join ejecutora e "
				+ "on e.id_ejecutora = res.id_ejecutora join persona p "
				+ "on p.dni = r.dni and p.dni = '"
				+ dni
				+ "' and r.estado = '1' " + "and res.estado = '1'";
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<ResponsableIdentificacion> obj = new LinkedList<ResponsableIdentificacion>();
		for (Map<String, Object> rec : lSectorMaps) {
			ResponsableIdentificacion s = new ResponsableIdentificacion();
			s.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			s.setDni((String) rec.get("DNI"));
			s.setCorreo(((String) rec.get("CORREO")).toLowerCase());
			s.setClave((String) rec.get("CLAVE"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setNombre((String) rec.get("NOMBRE"));
			// s.setFec_fin_censo((String)rec.get("FEC_FIN_CENSO"));
			// s.setPlazo((Number)rec.get("PLAZO"));
			s.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.add(s);
		}
		return obj;
	}

	public String VerificarExisteDNI(String dni, Number idEjecutora) {
		String dato = "";
		String sSQL = "";
		// TODO: Confirmar si debe Verificar tipo y nro de documento
		if (idEjecutora != null) {
			sSQL = "select dni from servicio_civil where dni = '" + dni
					+ "' and id_ejecutora = " + idEjecutora;
			List<Map<String, Object>> lTGMaps = jdbcTemplate.queryForList(sSQL);
			for (Map<String, Object> obj : lTGMaps) {
				dato = (String) obj.get("dni");
			}
		}

		return dato;

	}

	public String verificarExisteDNI(String dni) {
		String dato = "";
		String sSQL = "";
		// TODO: Confirmar si debe Verificar tipo y nro de documento
		sSQL = "select dni from persona where dni = '" + dni + "'";
		List<Map<String, Object>> lTGMaps = jdbcTemplate.queryForList(sSQL);
		for (Map<String, Object> obj : lTGMaps) {
			dato = (String) obj.get("dni");
		}
		return dato;
	}

	public void EliminarServicioCivil(ServicioCivil obj) {
		String sql = "call sp_del_servicio_civil(" + obj.getId_servicio_civil()
				+ "," + obj.getId_ambito() + ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	// METODO PRECIO PARA AGREGAR SERVICIO CIVIL, AGREGAR PERSONA
	public Integer AddPersona(ServicioCivil obj) {
		// Verificamos si existe el registro de la persona
		String sql = "select count(*)  from persona where dni = ? and id_persona ="
				+ obj.getId_persona();
		Integer seq = 0;
		int iCont = jdbcTemplate.queryForInt(sql, obj.getDni());
		if (iCont == 0) {

			sql = "SELECT SEQ_ID_PERSONA.nextval FROM DUAL";
			seq = jdbcTemplate.queryForInt(sql);
			sql = "INSERT INTO PERSONA(DNI, NOMBRES, APELLIDO_PATERNO"
					+ ", APELLIDO_MATERNO, FEC_NACIMIENTO, SEXO, COD_TIPO_DOC, ID_PERSONA) "
					+ " VALUES(?,?,?,?,?,?,?," + seq.toString() + ") ";
			jdbcTemplate.update(sql, obj.getDni(), obj.getNombres(),
					obj.getApellido_paterno(), obj.getApellido_materno(),
					obj.getFec_nacimiento(), obj.getSexo(),
					obj.getCod_tipo_doc());

		} else {
			// Actualizamos el registro
			sql = "UPDATE PERSONA SET NOMBRES= ?, APELLIDO_PATERNO= ?"
					+ ", APELLIDO_MATERNO= ?, FEC_NACIMIENTO= ?, SEXO= ?, COD_TIPO_DOC= ? "
					+ " WHERE trim(DNI) = trim(?) and ID_PERSONA = ?";
			jdbcTemplate.update(sql, obj.getNombres(),
					obj.getApellido_paterno(), obj.getApellido_materno(),
					obj.getFec_nacimiento(), obj.getSexo(),
					obj.getCod_tipo_doc(), obj.getDni(), obj.getId_persona());
		}
		return seq;
	}

	// METODO AGREGAR SERVICIO CIVIL
	public void AddServicioCivil(ServicioCivil obj, Number idServicioCivil) {
		String mensaje = "";
		String clave = "1234";
		// try
		// {
		// Generamos la clave de 4 digitos numéricos
		clave = (String) this.jdbcTemplate
				.queryForObject(
						"SELECT to_char(round(dbms_random.value(1000, 9999),0)) as clave FROM dual",
						String.class, new Object[] {});

		String sql = "INSERT into SERVICIO_CIVIL(ID_RESPONSABLE, ID_SERVICIO_CIVIL, CORREO, TELEFONO, FEC_OBSERVACION, PLAZO"
				+ ", FEC_SUBSANACION, DETALLE_OBSERVACION, ESTADO_OBSERVACION, ID_EJECUTORA, COD_PROFESION"
				+ ", COD_REGIMEN, CLAVE, DETALLE_SUBSANACION, FEC_REGISTRO, COD_ESTADO, DNI, DNIPREVIO, JEFE, ID_PERSONA,ID_PUESTO_TIPO, ESTADO_EQUIPO) "
				+ " VALUES(?,?,?,to_date(?,'DD/MM/YYYY'),?,to_date(?,'DD/MM/YYYY'),?,?,?,?,?,?,?,sysdate,?,?,?,?,?, ?) ";
		jdbcTemplate.update(sql, obj.getId_responsable(), idServicioCivil,
				obj.getCorreo(), obj.getTelefono(), obj.getFec_observacion(),
				obj.getPlazo(), obj.getFec_subsanacion(),
				obj.getDetalle_observacion(), obj.getEstado_observacion(),
				obj.getId_ejecutora(), obj.getCod_profesion(),
				obj.getCod_regimen(), clave, obj.getDetalle_subsanacion(),
				obj.getCod_estado(), obj.getDni(), obj.getDni(), obj.getJefe(),
				obj.getId_persona(), obj.getId_puesto_tipo(),
				obj.getEstado_equipo());

		sql = "INSERT into servicio_civil_ambito(ID_SERVICIO_CIVIL, ID_AMBITO) "
				+ " VALUES(?,?) ";
		jdbcTemplate.update(sql, idServicioCivil, obj.getId_ambito());

		/*
		 * } catch (Exception e) { // TODO: handle exception }
		 */
	}

	public String AgregarServicioCivil(ServicioCivil obj) {
		String mensaje = "";
		// try {
		// Add "Persona"
		Integer seqIdPersona = AddPersona(obj);
		// Get last Id "Servicio_Civil"
		obj.setId_persona(seqIdPersona);
		Number idServicioCivil = GetLastIdServicioCivil();
		// Add "Servicio_Civil"
		AddServicioCivil(obj, idServicioCivil);
		mensaje = idServicioCivil.toString();
		/*
		 * } catch (Exception e) { // TODO: handle exception
		 * System.out.println(e.getMessage()); }
		 */return mensaje;
	}

	public String agregarUsuario(JspUsuarioEdicion obj) {
		addPersona(obj.getPersona());
		addUsuario(obj.getUsuario());
		return "Los datos fueron grabados correctamente.";
	}

	public void addPersona(Persona obj) {
		// Verificamos si existe el registro de la persona
		String sql = "select count(*)  from persona where dni = ? and id_persona = ?";
		int iCont = jdbcTemplate.queryForInt(sql, obj.getDni(),
				obj.getId_persona());
		if (iCont == 0) {
			sql = "INSERT INTO PERSONA(DNI, NOMBRES, APELLIDO_PATERNO"
					+ ", APELLIDO_MATERNO, ID_PERSONA ) "
					+ " VALUES(?,?,?,?,?)";
			jdbcTemplate.update(sql, obj.getDni(), obj.getNombres(),
					obj.getApellido_paterno(), obj.getApellido_materno(),
					obj.getId_persona());

		} else {
			// Actualizamos el registro
			sql = "UPDATE PERSONA SET NOMBRES= ?, APELLIDO_PATERNO= ?"
					+ ", APELLIDO_MATERNO= ? " + " WHERE DNI = trim(?) ";
			jdbcTemplate.update(sql, obj.getNombres(),
					obj.getApellido_paterno(), obj.getApellido_materno(),
					obj.getDni());
		}
	}

	public void addUsuario(Usuario obj) {
		// Verificamos si existe el registro de la persona
		String sql = "select count(*)  from seg_usuario where cod_usuario = ?";
		int iCont = jdbcTemplate.queryForInt(sql, obj.getDni());
		if (iCont == 0) {
			sql = "INSERT INTO seg_usuario(cod_usuario,clave, correo, estado) "
					+ " VALUES(?,?,?,?)";
			jdbcTemplate.update(sql, obj.getDni(), obj.getClave(),
					obj.getCorreo(), obj.getEstado());

		} else {
			// Actualizamos el registro
			sql = "UPDATE seg_usuario SET clave= ?, correo= ?, estado = ?"
					+ " WHERE trim(cod_usuario) = trim(?)";
			jdbcTemplate.update(sql, obj.getClave(), obj.getCorreo(),
					obj.getEstado(), obj.getDni());
		}
		// agregar perfil
		sql = "delete seg_usuario_perfil where cod_usuario = '" + obj.getDni()
				+ "'";
		jdbcTemplate.update(sql);

		sql = "INSERT INTO seg_usuario_perfil(cod_usuario,id_perfil) "
				+ " VALUES(?,?)";
		jdbcTemplate.update(sql, obj.getDni(), obj.getId_perfil());

		sql = "	delete seg_usuario where cod_usuario not in (select dni from persona) ";
		jdbcTemplate.update(sql);

		sql = "	delete persona where dni not in (select dni from servicio_civil) and dni not in (select dni from responsable) "
				+ " and dni not in (select cod_usuario from seg_usuario)";
		jdbcTemplate.update(sql);

	}

	public String AgregarFuncionesSC(Number idServicioCivil,
			String listaFunciones, Number idAmbito) {
		String mensaje = "";
		// try
		// {
		String sql = "DELETE from servicio_civil_actividad where id_servicio_civil = ? ";
		jdbcTemplate.update(sql, idServicioCivil);

		sql = "insert into servicio_civil_actividad (id_servicio_civil, id_actividad) "
				+ " select "
				+ idServicioCivil.toString()
				+ " as id_sc, id_actividad "
				+ " from actividad where id_funcion in ("
				+ listaFunciones
				+ ")";
		jdbcTemplate.update(sql);
		/*
		 * } catch (Exception e) { mensaje = e.getMessage(); // TODO: handle
		 * exception }
		 */
		return mensaje;
	}

	// METODO PREVIO EDITAR PERSONA PARA EL METODO EDITAR SERVICIO CIVIL
	public void EditPersona(ServicioCivil obj) {
		// try
		// {
		// Puede darse el problema de una persona para la cual de cambiará el
		// numero de DNI
		String mensaje = "";
		String sql = "UPDATE PERSONA SET NOMBRES=?, APELLIDO_PATERNO=? "
				+ ", APELLIDO_MATERNO=?, FEC_NACIMIENTO=to_date(?,'DD/MM/YYYY'), SEXO=?"
				+ ", COD_TIPO_DOC=?, DNI = ? WHERE DNI = ? and ID_PERSONA = ?";
		jdbcTemplate.update(sql, obj.getNombres(), obj.getApellido_paterno(),
				obj.getApellido_materno(), obj.getFec_nacimiento(),
				obj.getSexo(), obj.getCod_tipo_doc(), obj.getDni(),
				obj.getDniPrevio(), obj.getId_persona());
		/*
		 * } catch (Exception e) { // TODO: handle exception }
		 */
	}

	public void EditPersona(Persona obj, String dniprevio) {
		// try
		// {
		// Puede darse el problema de una persona para la cual de cambiará el
		// numero de DNI
		String mensaje = "";
		String sql = "UPDATE PERSONA SET NOMBRES=upper(?), APELLIDO_PATERNO=upper(?) "
				+ ", APELLIDO_MATERNO=upper(?), FEC_NACIMIENTO=to_date(?,'DD/MM/YYYY'), SEXO=?"
				+ ", COD_TIPO_DOC=?, DNI = ? "
				+ ", TELEFONO = ?,ANEXO = ?,FAX = ?,CELULAR = ?, RPMRPC = ?,COMENTARIOS=? "
				+ " WHERE DNI = ? and ID_PERSONA = ?";
		jdbcTemplate.update(sql, obj.getNombres(), obj.getApellido_paterno(),
				obj.getApellido_materno(), obj.getFec_nacimiento(),
				obj.getSexo(), obj.getCod_tipo_doc(), obj.getDni(),
				obj.getTelefono(), obj.getAnexo(), obj.getFax(),
				obj.getCelular(), obj.getRpmrpc(), obj.getComentarios(),
				dniprevio, obj.getId_persona());
		/*
		 * } catch (Exception e) { // TODO: handle exception }
		 */
	}

	public void EditServicioCivil(ServicioCivil obj) {
		// try
		// {
		String sql = "update SERVICIO_CIVIL SET CORREO=?, TELEFONO=? "
				+ ", ID_EJECUTORA=?, COD_PROFESION=?"
				+ ", COD_REGIMEN=?, COD_ESTADO=?, DNI=?, DNIPREVIO = ? "
				+ ", JEFE =?, ID_PUESTO_TIPO= ?, ESTADO_EQUIPO = ? WHERE ID_SERVICIO_CIVIL = ? ";
		jdbcTemplate.update(sql, obj.getCorreo(), obj.getTelefono(),
				obj.getId_ejecutora(), obj.getCod_profesion(),
				obj.getCod_regimen(), obj.getCod_estado(), obj.getDni(),
				obj.getDni(), obj.getJefe(), obj.getId_puesto_tipo(),
				obj.getEstado_equipo(), obj.getId_servicio_civil());

		/*
		 * } catch (Exception e) { // TODO: handle exception }
		 */
	}

	public String EditarServicioCivil(ServicioCivil obj) {
		String mensaje = "";
		// try {
		// Edit "Persona"
		EditPersona(obj);

		// Edit "Servicio_Civil"
		EditServicioCivil(obj);
		/*
		 * } catch (Exception e) { // TODO: handle exception }
		 */
		return mensaje;
	}

	public void grabarValidacion(ServicioCivil obj) {
		String sql = "";

		sql = "update servicio_civil set cod_estado = 'VALI' "
				+ " where id_servicio_civil = ? ";
		jdbcTemplate.update(sql, obj.getId_servicio_civil());

		sql = "update persona set estado_validacion = '1', fec_validacion = sysdate "
				+ " where dni = ? and id_persona = ?";
		jdbcTemplate.update(sql, obj.getDni(), obj.getId_persona());

		sql = "update ejecutora set estado = '1'" + " where id_ejecutora = ? ";
		jdbcTemplate.update(sql, obj.getId_ejecutora());

		/*
		 * @JZM-23012013 Arson Se anula la forma de llamada al SP para poder
		 * obtener los parametros de salida
		 */
		// ejecutar el envio de correos
		/*
		 * sql = "call MAIL_CENSO.CORREO_VALIDA_PARTICIPANTE(" +
		 * obj.getId_servicio_civil() + ")"; jdbcTemplate.update(sql);
		 */
		try {
			sql = "{call MAIL_CENSO.CORREO_VALIDA_PARTICIPANTE(?,?,?,?,?)}";
			conn = this.dataSourceCenso.getConnection();
			callableStatement = conn.prepareCall(sql);

			callableStatement
					.setLong(1, obj.getId_servicio_civil().longValue());
			callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR); // PSENDER
			callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); // PRECIPIENT
			callableStatement.registerOutParameter(4, java.sql.Types.VARCHAR); // PSUBJECT
			callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); // PCONTENIDOFINAL
			callableStatement.executeUpdate();
			System.out
					.println("=========== Enviando correo con los datos ==========");
			System.out.println("Parametro Input 1 = "
					+ obj.getId_servicio_civil().longValue());
			System.out.println("Parametro OutPut 2 PSENDER = "
					+ callableStatement.getString(2));
			System.out.println("Parametro OutPut 3 PRECIPIENT = "
					+ callableStatement.getString(3));
			System.out.println("Parametro OutPut 4 PSUBJECT = "
					+ callableStatement.getString(4));
			System.out.println("Parametro OutPut 5 PCONTENIDOFINAL = "
					+ callableStatement.getString(5));

			// Se activa el envío del correo a través de Java
			SMTPSend.Mail(callableStatement.getString(4),
					callableStatement.getString(5),
					callableStatement.getString(3));
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(callableStatement == null)) {
				try {
					callableStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

		// Verificación de fin del proceso del censo para el responsable
		// Se comenta el código para evitar el cambio de ESTADO_REGISTRO a 3 en
		// la tabla RESPONSABLE_EJECUTORA_AMBITO
		// sql = "call MAIL_CENSO.VER_FIN_PROCESO(" + obj.getId_ejecutora() +
		// "," + obj.getId_ambito() + ")";
		// jdbcTemplate.update(sql);

	}

	public void grabarInvalidacion(ServicioCivil obj) {
		String sql = "";

		sql = "update servicio_civil set cod_estado = 'CONF' "
				+ " where id_servicio_civil = ? ";
		jdbcTemplate.update(sql, obj.getId_servicio_civil());

		sql = "update persona set estado_validacion = '0', fec_validacion = null "
				+ " where dni = ? and id_persona = ?";
		jdbcTemplate.update(sql, obj.getDni(), obj.getId_persona());

		sql = "update responsable_ejecutora_ambito set estado_registro = '2' "
				+ " where id_responsable = ? and id_ambito = ?";
		jdbcTemplate.update(sql, obj.getId_responsable(), obj.getId_ambito());

	}

	public void grabarObservacion(ServicioCivil obj) {

		// cambiar estado en servicio civil
		String sql = "";

		sql = "update servicio_civil set estado_observacion = '1', fec_observacion = sysdate, "
				+ " detalle_observacion = ?, cod_tipo_observacion = ?, plazo = ?, cod_estado = 'OBSE', "
				+ " estado_subsanacion = '0' "
				+ " where id_servicio_civil = ? ";
		jdbcTemplate.update(sql, obj.getDetalle_observacion(),
				obj.getCod_tipo_observacion(), obj.getPlazo(),
				obj.getId_servicio_civil());

		// cambiar el estado valdiacion de la persona

		sql = "update PERSONA set ESTADO_VALIDACION = '0', FEC_VALIDACION = NULL "
				+ " where DNI = ? and ID_PERSONA = ?";

		jdbcTemplate.update(sql, obj.getDni(), obj.getId_persona());

		// cambiar el estado del censo del responsable_ejecutora_ambito
		sql = "update responsable_ejecutora_ambito set ESTADO_REGISTRO = '1', FEC_CIERRE = "
				+ " NET_CORE.F_OBTENER_FECHA_CIERRE(to_date(sysdate) ,"
				+ obj.getPlazo() + ") " + " where ID_RESPONSABLE = ?";

		jdbcTemplate.update(sql, obj.getId_responsable());

		/*
		 * @JZM-23012013 Arson Se anula la forma de llamada al SP para poder
		 * obtener los parametros de salida
		 */
		// ejecutar el envio de correos
		// sql = "call MAIL_CENSO.CORREO_OBSERV_PARTICIPANTE(" +
		// obj.getId_servicio_civil() + ")";
		// jdbcTemplate.update(sql);

		try {
			sql = "{call MAIL_CENSO.CORREO_OBSERV_PARTICIPANTE(?,?,?,?,?)}";
			conn = this.dataSourceCenso.getConnection();
			callableStatement = conn.prepareCall(sql);

			callableStatement
					.setLong(1, obj.getId_servicio_civil().longValue());
			callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR); // PSENDER
			callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); // PRECIPIENT
			callableStatement.registerOutParameter(4, java.sql.Types.VARCHAR); // PSUBJECT
			callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); // PCONTENIDOFINAL
			callableStatement.executeUpdate();

			// Se activa el envío del correo a través de Java
			SMTPSend.Mail(callableStatement.getString(4),
					callableStatement.getString(5),
					callableStatement.getString(3));
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(callableStatement == null)) {
				try {
					callableStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public void grabarSubsanacion(ServicioCivil obj) {
		// el resgistro del participante vuelva al estado confirmado de esa
		// forma
		// no puede editarse
		String sql = "";
		sql = "update servicio_civil set estado_observacion = '0', fec_subsanacion = sysdate, "
				+ " detalle_subsanacion = ?, estado_subsanacion = '1', cod_estado = 'CONF' "
				+ " where id_servicio_civil = ? ";
		jdbcTemplate.update(sql, obj.getDetalle_subsanacion(),
				obj.getId_servicio_civil());

		// ejecutar el envio de correos
		// sql = "call correo_observ_participante(" + obj.getId_servicio_civil()
		// + ")";
		// jdbcTemplate.update(sql);
	}

	/*
	 * 
	 */
	public Ejecutora GetEjecutora(Number idEjecutora) {
		Ejecutora obj = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT EJ.ID_EJECUTORA, NVL(EJ.ID_PLIEGO,0) AS ID_PLIEGO, EJ.DESCRIPCION, EJ.TELEFONO, EJ.UBIGEO, EJ.UBIGEO_RPT, REG.REGIMEN, ");
		sql.append(" EJ.COD_ESTADO_ENVIO, NVL(EJ.ID_NIVEL_GOBIERNO,0) AS ID_NIVEL_GOBIERNO, EJ.ESTADO, NVL(SE.ID_SECTOR,0) AS ID_SECTOR, EJ.COD_REGIMEN, EJ.DIRECCION ");
		sql.append(" FROM EJECUTORA EJ LEFT JOIN PLIEGO PL ON EJ.ID_PLIEGO = PL.ID_PLIEGO ");
		sql.append(" LEFT JOIN SECTOR SE ON PL.ID_SECTOR = SE.ID_SECTOR ");
		sql.append(" LEFT JOIN CENSO.REGIMEN_EJECUTORA REG ON REG.COD_REGIMEN = EJ.COD_REGIMEN ");
		sql.append(" WHERE ID_EJECUTORA = ");
		sql.append(idEjecutora);
		System.out.println("GetEjecutora =======");
		System.out.println(sql.toString());
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql
				.toString());

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Ejecutora();

			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setId_pliego((Number) rec.get("ID_PLIEGO"));
			obj.setId_sector((Number) rec.get("ID_SECTOR"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setTelefono((String) rec.get("TELEFONO"));
			obj.setUbigeo((String) rec.get("UBIGEO"));
			obj.setUbigeo_rpt((String) rec.get("UBIGEO_RPT"));
			obj.setCod_estado_envio((String) rec.get("COD_ESTADO_ENVIO"));
			obj.setId_nivel_gobierno((Number) rec.get("ID_NIVEL_GOBIERNO"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setCod_regimen((String) rec.get("COD_REGIMEN"));
			obj.setDireccion((String) rec.get("DIRECCION"));
			obj.setRegimen((String) rec.get("REGIMEN"));
		}
		return obj;
	}

	public void finalizarInscripcionParticipantes(JspResponsableEdicion obj) {
		// Actualizamos el estado de todos los participantes
		System.out.println("finalizarInscripcionParticipantes ======");
		String sql = "UPDATE servicio_civil set COD_ESTADO = 'CONF', estado_observacion = '0' where id_ejecutora = ? and cod_estado in ('INIC','OBSE') "
				+ " and id_servicio_civil in (SELECT id_servicio_civil FROM servicio_civil_ambito where id_ambito = ?)";
		jdbcTemplate.update(sql, obj.getResponsable().getId_ejecutora(), obj
				.getResponsable().getId_ambito());
		// Actualizamos el estado del responsable por ambito
		sql = "update responsable_ejecutora_ambito set estado_registro = '2', FEC_FIN_CENSO=SYSDATE where id_responsable = ? and id_ejecutora = ? and id_ambito = ? ";
		jdbcTemplate.update(sql, obj.getResponsable().getId_responsable(), obj
				.getResponsable().getId_ejecutora(), obj.getResponsable()
				.getId_ambito());
		System.out.println("obj.getResponsable().getId_responsable() = "
				+ obj.getResponsable().getId_responsable());
		System.out.println("obj.getResponsable().getId_ejecutora() = "
				+ obj.getResponsable().getId_ejecutora());
		System.out.println("obj.getResponsable().getId_ambito() = "
				+ obj.getResponsable().getId_ambito());
	}

	public String ObtenerDescEtapaFuncion(Number idFuncion) {
		String dato = "";
		// try {
		// TODO: Confirmar si debe Verificar tipo y nro de documento
		String sSQL = "select (select trim(descripcion) from etapa where id_etapa = fun.id_etapa)  "
				+ " 	|| '|' || trim(descripcion) as desc_etapa_funcion "
				+ " from funcion fun where id_funcion = "
				+ idFuncion.toString();
		List<Map<String, Object>> lTGMaps = jdbcTemplate.queryForList(sSQL);
		for (Map<String, Object> obj : lTGMaps) {
			dato = (String) obj.get("desc_etapa_funcion");
		}
		/*
		 * } catch (Exception e) { // TODO: handle exception }
		 */

		return dato;

	}

	public List ObtenerActividades(Number idFuncion) {
		List actividades = null;

		String sql = "select id_actividad, descripcion "
				+ " from actividad where id_funcion = " + idFuncion.toString()
				+ " order by descripcion";

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> obj : lEntidadMaps) {
			Actividad g = new Actividad();
			g.setId_actividad((Number) obj.get("id_actividad"));
			g.setDescripcion((String) obj.get("descripcion"));
			if (actividades == null)
				actividades = new ArrayList();
			actividades.add(g);
			g = null;
		}
		return actividades;
	}

	public LinkedList<EjecutoraRegimen> ObtenerRegimenes() {
		LinkedList<EjecutoraRegimen> regimenes = null;

		String sql = "select cod_regimen, regimen from censo.REGIMEN_EJECUTORA";

		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> obj : lEntidadMaps) {
			EjecutoraRegimen g = new EjecutoraRegimen();
			g.setCod_regimen((String) obj.get("COD_REGIMEN"));
			g.setRegimen((String) obj.get("REGIMEN"));
			if (regimenes == null)
				regimenes = new LinkedList<EjecutoraRegimen>();
			regimenes.add(g);
			g = null;
		}
		return regimenes;
	}

	public Integer tieneResponsableLaEjecutora(Integer id_ejecutora) {
		try {
			Integer total = 0;
			String sql = "SELECT COUNT(ID_RESPONSABLE) FROM RESPONSABLE_EJECUTORA_AMBITO WHERE ESTADO_REGISTRO<>0 AND ID_EJECUTORA="
					+ id_ejecutora; // +" AND ESTADO_REGISTRO<>'0'";
			System.out.println("tieneResponsableLaEjecutora()");
			System.out.println(sql);
			total = this.jdbcTemplate.queryForInt(sql);
			return total;

		} catch (Exception e) {
			return -1;
		}
	}

	public void actualizarResponsableDeEjecutora(JspResponsableEdicion obj,
			Responsable responsableActual) {
		// public void actualizarResponsableDeEjecutora(JspResponsableEdicion
		// obj) {
		String sql = "";
		try {
			// Anula el registro anterior
			/*
			 * sql =
			 * "update servicio_civil set id_ejecutora = 0 where id_responsable = ? and dni = ?"
			 * ; jdbcTemplate.update(sql,responsableActual.getId_responsable(),
			 * responsableActual.getDni());
			 * System.out.println("actualizarResponsableDeEjecutora: "+sql);
			 * System
			 * .out.println("PARAM01: "+responsableActual.getId_responsable());
			 * System.out.println("PARAM02: "+responsableActual.getDni());
			 */
			// Actualizar miembros servicio_civil por el nuevo responsable
			// sql =
			// "update servicio_civil set id_responsable = ? where id_responsable = ? and id_ejecutora = ?";
			// jdbcTemplate.update(sql,obj.getResponsable().getId_responsable(),responsableActual.getId_responsable(),responsableActual.getId_ejecutora());
			sql = "update servicio_civil set id_responsable = ? where id_ejecutora = ? and id_responsable <> ? ";
			jdbcTemplate.update(sql, obj.getResponsable().getId_responsable(),
					obj.getEjecutora().getId_ejecutora(),
					responsableActual.getId_responsable());

			System.out.println("actualizarResponsableDeEjecutora: " + sql);
			System.out.println("PARAM01: "
					+ obj.getResponsable().getId_responsable());
			System.out.println("PARAM02: "
					+ obj.getEjecutora().getId_ejecutora());
			System.out.println("PARAM03: "
					+ responsableActual.getId_responsable());
			// Desasignar a Responsable de la Ejecutora
			// if (!obj.getResponsable().getId_responsable()
			// .equals(responsableActual.getId_responsable())) {
			// sql =
			// "update responsable_ejecutora_ambito set id_ejecutora = 0, ESTADO_REGISTRO = '0' where id_responsable = ? and id_ejecutora = ?";
			// jdbcTemplate.update(sql, responsableActual.getId_responsable(),
			// responsableActual.getId_ejecutora());
			// System.out.println("actualizarResponsableDeEjecutora: " + sql);
			// System.out.println("PARAM01: "
			// + responsableActual.getId_responsable());
			// System.out.println("PARAM02: "
			// + responsableActual.getId_ejecutora());
			// }
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public Persona GetOtraPersonaPorEmail(Integer id_persona, String email,
			Number idAmbito) {
		Persona obj = null;

		String sql = "SELECT S1.DNI, "
				+ "S1.NOMBRES, "
				+ "S1.APELLIDO_PATERNO, "
				+ "S1.APELLIDO_MATERNO, "
				+ "TO_CHAR (S1.FEC_NACIMIENTO, 'DD/MM/YYYY') AS FEC_NACIMIENTO, "
				+ "S1.SEXO, "
				+ "S1.COD_TIPO_DOC, "
				+ "NVL (S1.ESTADO_VALIDACION, '0') AS ESTADO_VALIDACION, "
				+ "TO_CHAR (S1.FEC_VALIDACION, 'DD/MM/YYYY') AS FEC_VALIDACION, "
				+ "S1.ROL_VALIDACION, "
				+ "S1.ID_PERSONA "
				+ "FROM PERSONA S1 "
				+ "JOIN RESPONSABLE S2 ON S1.ID_PERSONA = S2.ID_PERSONA "
				+ "JOIN RESPONSABLE_EJECUTORA_AMBITO S3 ON S3.ID_RESPONSABLE=S2.ID_RESPONSABLE "
				+ "WHERE UPPER(S2.CORREO) = UPPER('" + email
				+ "') AND S1.ID_PERSONA <> " + id_persona
				+ " AND S3.ID_AMBITO=" + idAmbito;
		; // and id_persona = " + responsable.getId_persona();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Persona();
			obj.setDni((String) rec.get("DNI"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setNombres((String) rec.get("NOMBRES"));
			obj.setApellido_paterno((String) rec.get("APELLIDO_PATERNO"));
			obj.setApellido_materno((String) rec.get("APELLIDO_MATERNO"));
			obj.setFec_nacimiento((String) rec.get("FEC_NACIMIENTO"));
			obj.setSexo((String) rec.get("SEXO"));
			obj.setCod_tipo_doc((String) rec.get("COD_TIPO_DOC"));
			obj.setEstado_validacion((String) rec.get("ESTADO_VALIDACION"));
			obj.setFec_validacion((String) rec.get("FEC_VALIDACION"));
			obj.setRol_validacion((String) rec.get("ROL_VALIDACION"));
		}
		return obj;
	}

	public Persona GetOtraPersonaPorDni(Integer id_persona, String dni,
			Number idAmbito) {
		Persona obj = null;

		String sql = "SELECT S1.DNI,S1.NOMBRES,S1.APELLIDO_PATERNO,S1.APELLIDO_MATERNO,to_char(S1.FEC_NACIMIENTO,'DD/MM/YYYY') as FEC_NACIMIENTO"
				+ " ,S1.SEXO,S1.COD_TIPO_DOC,nvl(S1.ESTADO_VALIDACION,'0') as ESTADO_VALIDACION,to_char(S1.FEC_VALIDACION,'DD/MM/YYYY') as FEC_VALIDACION,"
				+ "S1.ROL_VALIDACION, S1.ID_PERSONA FROM PERSONA S1 "
				+ "JOIN RESPONSABLE S2 ON S2.ID_PERSONA=S1.ID_PERSONA "
				+ "JOIN RESPONSABLE_EJECUTORA_AMBITO S3 ON S3.ID_RESPONSABLE=S2.ID_RESPONSABLE "
				+ "WHERE S2.dni = '"
				+ dni
				+ "' and S1.id_persona <> "
				+ id_persona + " AND S3.ID_AMBITO=" + idAmbito;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Persona();
			obj.setDni((String) rec.get("DNI"));
			obj.setId_persona((Number) rec.get("ID_PERSONA"));
			obj.setNombres((String) rec.get("NOMBRES"));
			obj.setApellido_paterno((String) rec.get("APELLIDO_PATERNO"));
			obj.setApellido_materno((String) rec.get("APELLIDO_MATERNO"));
			obj.setFec_nacimiento((String) rec.get("FEC_NACIMIENTO"));
			obj.setSexo((String) rec.get("SEXO"));
			obj.setCod_tipo_doc((String) rec.get("COD_TIPO_DOC"));
			obj.setEstado_validacion((String) rec.get("ESTADO_VALIDACION"));
			obj.setFec_validacion((String) rec.get("FEC_VALIDACION"));
			obj.setRol_validacion((String) rec.get("ROL_VALIDACION"));
		}
		return obj;
	}
	
	public String VerificarExisteOtroDNI(String dni, Number idAmbito, Number idServicioCivil)
	{
		String dato ="";
		String sSQL = "select s1.dni from servicio_civil s1 "+
		"join servicio_civil_ambito s2 "+ 
		"on S2.ID_SERVICIO_CIVIL = S1.ID_SERVICIO_CIVIL "+
		"join (select id_ambito from ambito where id_sistema in (select id_sistema from ambito where id_ambito="+idAmbito+") ) s3  "+ 
		"on s3.id_ambito = s2.id_ambito "+
		"where s1.dni='" + dni + "' and s1.id_servicio_civil <> "+idServicioCivil;
			System.out.println("VerificarExisteOtroDNI");
			System.out.println(sSQL);
			List<Map<String, Object>> lTGMaps = jdbcTemplate.queryForList(sSQL);			
			for(Map<String, Object> obj : lTGMaps){
				dato = (String)obj.get("dni"); 
			}
		
		return dato;
		
	}
	
	public String VerificarExisteOtroCorreo(String correo, Number idAmbito, Number idServicioCivil)
	{
		String dato ="";
		String sSQL = "select s1.dni from servicio_civil s1 "+
		"join servicio_civil_ambito s2 "+ 
		"on S2.ID_SERVICIO_CIVIL = S1.ID_SERVICIO_CIVIL "+
		"join (select id_ambito from ambito where id_sistema in (select id_sistema from ambito where id_ambito="+idAmbito+") ) s3  "+ 
		"on s3.id_ambito = s2.id_ambito "+
		"where s1.correo=upper('" + correo + "')" + " and s1.id_servicio_civil <> "+idServicioCivil;
			System.out.println("VerificarExisteOtroCorreo");
			System.out.println(sSQL);
			List<Map<String, Object>> lTGMaps = jdbcTemplate.queryForList(sSQL);			
			for(Map<String, Object> obj : lTGMaps){
				dato = (String)obj.get("dni"); 
			}
				
		return dato;
	}
	
	public List<String> getParametroCorreo() {
		List<String> retorno = new ArrayList<String>();
		String sql = "SELECT COD_PARAMETRO,VAL_PARAMETRO FROM PARAMETRO_CORREO "
				+ "WHERE COD_PARAMETRO IN ('CCO','DOMAIN','PASSWORD','PORT','SERVER','USER_FROM') "
				+ "ORDER BY COD_PARAMETRO";
		List<Map<String, Object>> parametro = jdbcTemplate.queryForList(sql);
		for (Map<String, Object> obj : parametro) {
			retorno.add((String) obj.get("VAL_PARAMETRO"));
		}
		return retorno;
	}

	@Override
	public void eliminarParticipantes(String lsql) {
		// TODO Auto-generated method stub
		List<Map<String, Object>> parametro = jdbcTemplate.queryForList(lsql);
		for (Map<String, Object> obj : parametro) {
			BigDecimal idParticipante = (BigDecimal) obj.get("ID_PARTICIPANTE");
			this.eliminarParticipante(idParticipante.intValue());
		}
	}
	
	@Override
	public void informarPruebaPorCorreo(Integer idTest) {
		String sql = "SELECT PA.ID_PARTICIPANTE, PA.EVALUADO, SC.CORREO " +
					 " FROM PARTICIPANTE PA JOIN SERVICIO_CIVIL SC ON SC.ID_SERVICIO_CIVIL = PA.ID_SERVICIO_CIVIL" +
					 " WHERE PA.ID_TEST = "+idTest+" AND ESTADO = 1";
		
		System.out.println("informarPruebaPorCorreo(Integer idTest)");
		System.out.println("=======================================");
		System.out.println(sql);
		
		List<Map<String, Object>> participantes = jdbcTemplate.queryForList(sql);
		for (Map<String, Object> participante : participantes) {
			try {
				sql = "{call MAIL_DIAGNOSTICO.CORREO_ENVIO_RESULTADO(?,?,?)}";
				conn = this.dataSourceCenso.getConnection();
				callableStatement = conn.prepareCall(sql);
				callableStatement.setBigDecimal(1,
						(BigDecimal) participante.get("ID_PARTICIPANTE"));
				callableStatement.registerOutParameter(2,
						java.sql.Types.VARCHAR); // PSENDER
				callableStatement.registerOutParameter(3,
						java.sql.Types.VARCHAR); // PRECIPIENT
				callableStatement.executeUpdate();
				System.out.println("ID_PARTICIPANTE : "
						+ participante.get("ID_PARTICIPANTE"));
				System.out.println("X_CONTENIDOFINAL    : "
						+ callableStatement.getString(3));
				// Se activa el envío del correo a través de Java
				SMTPSend.Mail(callableStatement.getString(2),
						callableStatement.getString(3),
						(String) participante.get("CORREO"));
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if (!(callableStatement == null)) {
					try {
						callableStatement.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(conn == null)) {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}	
	}
	
	@Override
	public void cerrarPrueba(Integer idTest) {
		String sql = "UPDATE participante SET estado = '0' WHERE id_test = "+idTest;
		jdbcTemplate.update(sql);
	    
		sql = "UPDATE test SET cod_ejecutado = '1' WHERE id_test = "+idTest;
		jdbcTemplate.update(sql);
	}
	
	@Override
	public void ejecutarEnvioMasivo(String cod_tipo, String dniUsuario) {
		String sql = "SELECT DCM.ID_SERVICIO_CIVIL, SC.CORREO "
				+ "FROM CORREO_MASIVO CM, DETALLE_CORREO_MASIVO DCM, SERVICIO_CIVIL SC "
				+ "WHERE     CM.ID_CORREO = DCM.ID_CORREO "
				+ "  AND DCM.ID_SERVICIO_CIVIL = SC.ID_SERVICIO_CIVIL "
				+ "AND DCM.ESTADO = '1' " + "AND CM.ENVIADO = 0 "
				+ "AND CM.COD_USUARIO = ?";

		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql,
				dniUsuario);

		for (Map<String, Object> rec : lSectorMaps) {
			try {
				sql = "{call MAIL_DIAGNOSTICO.DATOS_CORREO_MASIVO(?,?,?,?)}";
				conn = this.dataSourceCenso.getConnection();
				callableStatement = conn.prepareCall(sql);
				callableStatement.setBigDecimal(1,
						(BigDecimal) rec.get("ID_SERVICIO_CIVIL"));
				callableStatement.setString(2, cod_tipo);
				callableStatement.registerOutParameter(3,
						java.sql.Types.VARCHAR); // PSENDER
				callableStatement.registerOutParameter(4,
						java.sql.Types.VARCHAR); // PRECIPIENT
				callableStatement.executeUpdate();
				System.out.println("X_ID_SERVICIO_CIVIL : "
						+ rec.get("ID_SERVICIO_CIVIL"));
				System.out.println("X_COD_TIPO          : " + cod_tipo);
				// System.out.println("X_SUBJECT           : "+callableStatement.getString(3));
				System.out.println("X_CONTENIDOFINAL    : "
						+ callableStatement.getString(4));
				// Se activa el envío del correo a través de Java
				SMTPSend.Mail(callableStatement.getString(3),
						callableStatement.getString(4),
						(String) rec.get("CORREO"));
				// SMTPSend.Mail(callableStatement.getString(3),
				// callableStatement.getString(4),"jvaler@servir.gob.pe,jtorres@servir.gob.pe,infraestructura_ti@servir.gob.pe");
				System.out.println("Correo enviado a ID_SERVICIO_CIVIL: "
						+ rec.get("ID_SERVICIO_CIVIL") + ", CORREO: "
						+ (String) rec.get("CORREO"));
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if (!(callableStatement == null)) {
					try {
						callableStatement.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(conn == null)) {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}
}